Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux
Pull drm fixes from Dave Airlie: "Summary: - Misc amdgpu/radeon fixes - VC4 build fix - vmwgfx fix - misc rockchip fixes The etnaviv guys had an API feature they wanted in their first release, so I've merged that with their fixes" * 'drm-fixes' of git://people.freedesktop.org/~airlied/linux: (41 commits) drm/vmwgfx: respect 'nomodeset' drm/amdgpu: only move pt bos in LRU list on success drm/radeon: fix DP audio support for APU with DCE4.1 display engine drm/radeon: Add a common function for DFS handling drm/radeon: cleaned up VCO output settings for DP audio drm/amd/powerplay: Update SMU firmware loading for Stoney drm/etnaviv: call correct function when trying to vmap a DMABUF drm/etnaviv: rename etnaviv_gem_vaddr to etnaviv_gem_vmap drm/etnaviv: fix get pages error path in etnaviv_gem_vaddr drm/etnaviv: fix memory leak in IOMMU init path drm/etnaviv: add further minor features and varyings count drm/etnaviv: add helper for comparing model/revision IDs drm/etnaviv: add helper to extract bitfields drm/etnaviv: use defined constants for the chip model drm/etnaviv: update common and state_hi xml.h files drm/etnaviv: ignore VG GPUs with FE2.0 drm/amdgpu: don't init fbdev if we don't have any connectors drm/radeon: only init fbdev if we have connectors drm/radeon: Ensure radeon bo is unreserved in radeon_gem_va_ioctl drm/etnaviv: fix failure path if model is zero ...
This commit is contained in:
commit
b943d0b9c7
|
@ -2278,60 +2278,60 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring)
|
|||
#define amdgpu_dpm_enable_bapm(adev, e) (adev)->pm.funcs->enable_bapm((adev), (e))
|
||||
|
||||
#define amdgpu_dpm_get_temperature(adev) \
|
||||
(adev)->pp_enabled ? \
|
||||
((adev)->pp_enabled ? \
|
||||
(adev)->powerplay.pp_funcs->get_temperature((adev)->powerplay.pp_handle) : \
|
||||
(adev)->pm.funcs->get_temperature((adev))
|
||||
(adev)->pm.funcs->get_temperature((adev)))
|
||||
|
||||
#define amdgpu_dpm_set_fan_control_mode(adev, m) \
|
||||
(adev)->pp_enabled ? \
|
||||
((adev)->pp_enabled ? \
|
||||
(adev)->powerplay.pp_funcs->set_fan_control_mode((adev)->powerplay.pp_handle, (m)) : \
|
||||
(adev)->pm.funcs->set_fan_control_mode((adev), (m))
|
||||
(adev)->pm.funcs->set_fan_control_mode((adev), (m)))
|
||||
|
||||
#define amdgpu_dpm_get_fan_control_mode(adev) \
|
||||
(adev)->pp_enabled ? \
|
||||
((adev)->pp_enabled ? \
|
||||
(adev)->powerplay.pp_funcs->get_fan_control_mode((adev)->powerplay.pp_handle) : \
|
||||
(adev)->pm.funcs->get_fan_control_mode((adev))
|
||||
(adev)->pm.funcs->get_fan_control_mode((adev)))
|
||||
|
||||
#define amdgpu_dpm_set_fan_speed_percent(adev, s) \
|
||||
(adev)->pp_enabled ? \
|
||||
((adev)->pp_enabled ? \
|
||||
(adev)->powerplay.pp_funcs->set_fan_speed_percent((adev)->powerplay.pp_handle, (s)) : \
|
||||
(adev)->pm.funcs->set_fan_speed_percent((adev), (s))
|
||||
(adev)->pm.funcs->set_fan_speed_percent((adev), (s)))
|
||||
|
||||
#define amdgpu_dpm_get_fan_speed_percent(adev, s) \
|
||||
(adev)->pp_enabled ? \
|
||||
((adev)->pp_enabled ? \
|
||||
(adev)->powerplay.pp_funcs->get_fan_speed_percent((adev)->powerplay.pp_handle, (s)) : \
|
||||
(adev)->pm.funcs->get_fan_speed_percent((adev), (s))
|
||||
(adev)->pm.funcs->get_fan_speed_percent((adev), (s)))
|
||||
|
||||
#define amdgpu_dpm_get_sclk(adev, l) \
|
||||
(adev)->pp_enabled ? \
|
||||
((adev)->pp_enabled ? \
|
||||
(adev)->powerplay.pp_funcs->get_sclk((adev)->powerplay.pp_handle, (l)) : \
|
||||
(adev)->pm.funcs->get_sclk((adev), (l))
|
||||
(adev)->pm.funcs->get_sclk((adev), (l)))
|
||||
|
||||
#define amdgpu_dpm_get_mclk(adev, l) \
|
||||
(adev)->pp_enabled ? \
|
||||
((adev)->pp_enabled ? \
|
||||
(adev)->powerplay.pp_funcs->get_mclk((adev)->powerplay.pp_handle, (l)) : \
|
||||
(adev)->pm.funcs->get_mclk((adev), (l))
|
||||
(adev)->pm.funcs->get_mclk((adev), (l)))
|
||||
|
||||
|
||||
#define amdgpu_dpm_force_performance_level(adev, l) \
|
||||
(adev)->pp_enabled ? \
|
||||
((adev)->pp_enabled ? \
|
||||
(adev)->powerplay.pp_funcs->force_performance_level((adev)->powerplay.pp_handle, (l)) : \
|
||||
(adev)->pm.funcs->force_performance_level((adev), (l))
|
||||
(adev)->pm.funcs->force_performance_level((adev), (l)))
|
||||
|
||||
#define amdgpu_dpm_powergate_uvd(adev, g) \
|
||||
(adev)->pp_enabled ? \
|
||||
((adev)->pp_enabled ? \
|
||||
(adev)->powerplay.pp_funcs->powergate_uvd((adev)->powerplay.pp_handle, (g)) : \
|
||||
(adev)->pm.funcs->powergate_uvd((adev), (g))
|
||||
(adev)->pm.funcs->powergate_uvd((adev), (g)))
|
||||
|
||||
#define amdgpu_dpm_powergate_vce(adev, g) \
|
||||
(adev)->pp_enabled ? \
|
||||
((adev)->pp_enabled ? \
|
||||
(adev)->powerplay.pp_funcs->powergate_vce((adev)->powerplay.pp_handle, (g)) : \
|
||||
(adev)->pm.funcs->powergate_vce((adev), (g))
|
||||
(adev)->pm.funcs->powergate_vce((adev), (g)))
|
||||
|
||||
#define amdgpu_dpm_debugfs_print_current_performance_level(adev, m) \
|
||||
(adev)->pp_enabled ? \
|
||||
((adev)->pp_enabled ? \
|
||||
(adev)->powerplay.pp_funcs->print_current_performance_level((adev)->powerplay.pp_handle, (m)) : \
|
||||
(adev)->pm.funcs->debugfs_print_current_performance_level((adev), (m))
|
||||
(adev)->pm.funcs->debugfs_print_current_performance_level((adev), (m)))
|
||||
|
||||
#define amdgpu_dpm_get_current_power_state(adev) \
|
||||
(adev)->powerplay.pp_funcs->get_current_power_state((adev)->powerplay.pp_handle)
|
||||
|
|
|
@ -478,9 +478,9 @@ static void amdgpu_cs_parser_fini(struct amdgpu_cs_parser *parser, int error, bo
|
|||
struct amdgpu_fpriv *fpriv = parser->filp->driver_priv;
|
||||
unsigned i;
|
||||
|
||||
amdgpu_vm_move_pt_bos_in_lru(parser->adev, &fpriv->vm);
|
||||
|
||||
if (!error) {
|
||||
amdgpu_vm_move_pt_bos_in_lru(parser->adev, &fpriv->vm);
|
||||
|
||||
/* Sort the buffer list from the smallest to largest buffer,
|
||||
* which affects the order of buffers in the LRU list.
|
||||
* This assures that the smallest buffers are added first
|
||||
|
|
|
@ -333,6 +333,10 @@ int amdgpu_fbdev_init(struct amdgpu_device *adev)
|
|||
if (!adev->mode_info.mode_config_initialized)
|
||||
return 0;
|
||||
|
||||
/* don't init fbdev if there are no connectors */
|
||||
if (list_empty(&adev->ddev->mode_config.connector_list))
|
||||
return 0;
|
||||
|
||||
/* select 8 bpp console on low vram cards */
|
||||
if (adev->mc.real_vram_size <= (32*1024*1024))
|
||||
bpp_sel = 8;
|
||||
|
|
|
@ -399,7 +399,8 @@ int amdgpu_bo_pin_restricted(struct amdgpu_bo *bo, u32 domain,
|
|||
}
|
||||
if (fpfn > bo->placements[i].fpfn)
|
||||
bo->placements[i].fpfn = fpfn;
|
||||
if (lpfn && lpfn < bo->placements[i].lpfn)
|
||||
if (!bo->placements[i].lpfn ||
|
||||
(lpfn && lpfn < bo->placements[i].lpfn))
|
||||
bo->placements[i].lpfn = lpfn;
|
||||
bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
|
||||
}
|
||||
|
|
|
@ -99,13 +99,24 @@ static int amdgpu_pp_early_init(void *handle)
|
|||
|
||||
#ifdef CONFIG_DRM_AMD_POWERPLAY
|
||||
switch (adev->asic_type) {
|
||||
case CHIP_TONGA:
|
||||
case CHIP_FIJI:
|
||||
adev->pp_enabled = (amdgpu_powerplay > 0) ? true : false;
|
||||
break;
|
||||
default:
|
||||
adev->pp_enabled = (amdgpu_powerplay > 0) ? true : false;
|
||||
break;
|
||||
case CHIP_TONGA:
|
||||
case CHIP_FIJI:
|
||||
adev->pp_enabled = (amdgpu_powerplay == 0) ? false : true;
|
||||
break;
|
||||
case CHIP_CARRIZO:
|
||||
case CHIP_STONEY:
|
||||
adev->pp_enabled = (amdgpu_powerplay > 0) ? true : false;
|
||||
break;
|
||||
/* These chips don't have powerplay implemenations */
|
||||
case CHIP_BONAIRE:
|
||||
case CHIP_HAWAII:
|
||||
case CHIP_KABINI:
|
||||
case CHIP_MULLINS:
|
||||
case CHIP_KAVERI:
|
||||
case CHIP_TOPAZ:
|
||||
default:
|
||||
adev->pp_enabled = false;
|
||||
break;
|
||||
}
|
||||
#else
|
||||
adev->pp_enabled = false;
|
||||
|
|
|
@ -487,7 +487,7 @@ static int amdgpu_debugfs_ring_info(struct seq_file *m, void *data)
|
|||
seq_printf(m, "rptr: 0x%08x [%5d]\n",
|
||||
rptr, rptr);
|
||||
|
||||
rptr_next = ~0;
|
||||
rptr_next = le32_to_cpu(*ring->next_rptr_cpu_addr);
|
||||
|
||||
seq_printf(m, "driver's copy of the wptr: 0x%08x [%5d]\n",
|
||||
ring->wptr, ring->wptr);
|
||||
|
|
|
@ -1282,7 +1282,7 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm)
|
|||
{
|
||||
const unsigned align = min(AMDGPU_VM_PTB_ALIGN_SIZE,
|
||||
AMDGPU_VM_PTE_COUNT * 8);
|
||||
unsigned pd_size, pd_entries, pts_size;
|
||||
unsigned pd_size, pd_entries;
|
||||
int i, r;
|
||||
|
||||
for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
|
||||
|
@ -1300,8 +1300,7 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm)
|
|||
pd_entries = amdgpu_vm_num_pdes(adev);
|
||||
|
||||
/* allocate page table array */
|
||||
pts_size = pd_entries * sizeof(struct amdgpu_vm_pt);
|
||||
vm->page_tables = kzalloc(pts_size, GFP_KERNEL);
|
||||
vm->page_tables = drm_calloc_large(pd_entries, sizeof(struct amdgpu_vm_pt));
|
||||
if (vm->page_tables == NULL) {
|
||||
DRM_ERROR("Cannot allocate memory for page table array\n");
|
||||
return -ENOMEM;
|
||||
|
@ -1361,7 +1360,7 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm)
|
|||
|
||||
for (i = 0; i < amdgpu_vm_num_pdes(adev); i++)
|
||||
amdgpu_bo_unref(&vm->page_tables[i].entry.robj);
|
||||
kfree(vm->page_tables);
|
||||
drm_free_large(vm->page_tables);
|
||||
|
||||
amdgpu_bo_unref(&vm->page_directory);
|
||||
fence_put(vm->page_directory_fence);
|
||||
|
|
|
@ -4186,7 +4186,18 @@ static int gfx_v8_0_soft_reset(void *handle)
|
|||
gfx_v8_0_cp_gfx_enable(adev, false);
|
||||
|
||||
/* Disable MEC parsing/prefetching */
|
||||
/* XXX todo */
|
||||
gfx_v8_0_cp_compute_enable(adev, false);
|
||||
|
||||
if (grbm_soft_reset || srbm_soft_reset) {
|
||||
tmp = RREG32(mmGMCON_DEBUG);
|
||||
tmp = REG_SET_FIELD(tmp,
|
||||
GMCON_DEBUG, GFX_STALL, 1);
|
||||
tmp = REG_SET_FIELD(tmp,
|
||||
GMCON_DEBUG, GFX_CLEAR, 1);
|
||||
WREG32(mmGMCON_DEBUG, tmp);
|
||||
|
||||
udelay(50);
|
||||
}
|
||||
|
||||
if (grbm_soft_reset) {
|
||||
tmp = RREG32(mmGRBM_SOFT_RESET);
|
||||
|
@ -4215,6 +4226,16 @@ static int gfx_v8_0_soft_reset(void *handle)
|
|||
WREG32(mmSRBM_SOFT_RESET, tmp);
|
||||
tmp = RREG32(mmSRBM_SOFT_RESET);
|
||||
}
|
||||
|
||||
if (grbm_soft_reset || srbm_soft_reset) {
|
||||
tmp = RREG32(mmGMCON_DEBUG);
|
||||
tmp = REG_SET_FIELD(tmp,
|
||||
GMCON_DEBUG, GFX_STALL, 0);
|
||||
tmp = REG_SET_FIELD(tmp,
|
||||
GMCON_DEBUG, GFX_CLEAR, 0);
|
||||
WREG32(mmGMCON_DEBUG, tmp);
|
||||
}
|
||||
|
||||
/* Wait a little for things to settle down */
|
||||
udelay(50);
|
||||
gfx_v8_0_print_status((void *)adev);
|
||||
|
|
|
@ -122,25 +122,12 @@ static int tonga_dpm_hw_fini(void *handle)
|
|||
|
||||
static int tonga_dpm_suspend(void *handle)
|
||||
{
|
||||
return 0;
|
||||
return tonga_dpm_hw_fini(handle);
|
||||
}
|
||||
|
||||
static int tonga_dpm_resume(void *handle)
|
||||
{
|
||||
int ret;
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
mutex_lock(&adev->pm.mutex);
|
||||
|
||||
ret = tonga_smu_start(adev);
|
||||
if (ret) {
|
||||
DRM_ERROR("SMU start failed\n");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
fail:
|
||||
mutex_unlock(&adev->pm.mutex);
|
||||
return ret;
|
||||
return tonga_dpm_hw_init(handle);
|
||||
}
|
||||
|
||||
static int tonga_dpm_set_clockgating_state(void *handle,
|
||||
|
|
|
@ -64,6 +64,11 @@ static int pp_sw_init(void *handle)
|
|||
if (ret == 0)
|
||||
ret = hwmgr->hwmgr_func->backend_init(hwmgr);
|
||||
|
||||
if (ret)
|
||||
printk("amdgpu: powerplay initialization failed\n");
|
||||
else
|
||||
printk("amdgpu: powerplay initialized\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -272,6 +272,9 @@ static int cz_start_smu(struct pp_smumgr *smumgr)
|
|||
UCODE_ID_CP_MEC_JT1_MASK |
|
||||
UCODE_ID_CP_MEC_JT2_MASK;
|
||||
|
||||
if (smumgr->chip_id == CHIP_STONEY)
|
||||
fw_to_check &= ~(UCODE_ID_SDMA1_MASK | UCODE_ID_CP_MEC_JT2_MASK);
|
||||
|
||||
cz_request_smu_load_fw(smumgr);
|
||||
cz_check_fw_load_finish(smumgr, fw_to_check);
|
||||
|
||||
|
@ -282,7 +285,7 @@ static int cz_start_smu(struct pp_smumgr *smumgr)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static uint8_t cz_translate_firmware_enum_to_arg(
|
||||
static uint8_t cz_translate_firmware_enum_to_arg(struct pp_smumgr *smumgr,
|
||||
enum cz_scratch_entry firmware_enum)
|
||||
{
|
||||
uint8_t ret = 0;
|
||||
|
@ -292,7 +295,10 @@ static uint8_t cz_translate_firmware_enum_to_arg(
|
|||
ret = UCODE_ID_SDMA0;
|
||||
break;
|
||||
case CZ_SCRATCH_ENTRY_UCODE_ID_SDMA1:
|
||||
ret = UCODE_ID_SDMA1;
|
||||
if (smumgr->chip_id == CHIP_STONEY)
|
||||
ret = UCODE_ID_SDMA0;
|
||||
else
|
||||
ret = UCODE_ID_SDMA1;
|
||||
break;
|
||||
case CZ_SCRATCH_ENTRY_UCODE_ID_CP_CE:
|
||||
ret = UCODE_ID_CP_CE;
|
||||
|
@ -307,7 +313,10 @@ static uint8_t cz_translate_firmware_enum_to_arg(
|
|||
ret = UCODE_ID_CP_MEC_JT1;
|
||||
break;
|
||||
case CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT2:
|
||||
ret = UCODE_ID_CP_MEC_JT2;
|
||||
if (smumgr->chip_id == CHIP_STONEY)
|
||||
ret = UCODE_ID_CP_MEC_JT1;
|
||||
else
|
||||
ret = UCODE_ID_CP_MEC_JT2;
|
||||
break;
|
||||
case CZ_SCRATCH_ENTRY_UCODE_ID_GMCON_RENG:
|
||||
ret = UCODE_ID_GMCON_RENG;
|
||||
|
@ -396,7 +405,7 @@ static int cz_smu_populate_single_scratch_task(
|
|||
struct SMU_Task *task = &toc->tasks[cz_smu->toc_entry_used_count++];
|
||||
|
||||
task->type = type;
|
||||
task->arg = cz_translate_firmware_enum_to_arg(fw_enum);
|
||||
task->arg = cz_translate_firmware_enum_to_arg(smumgr, fw_enum);
|
||||
task->next = is_last ? END_OF_TASK_LIST : cz_smu->toc_entry_used_count;
|
||||
|
||||
for (i = 0; i < cz_smu->scratch_buffer_length; i++)
|
||||
|
@ -433,7 +442,7 @@ static int cz_smu_populate_single_ucode_load_task(
|
|||
struct SMU_Task *task = &toc->tasks[cz_smu->toc_entry_used_count++];
|
||||
|
||||
task->type = TASK_TYPE_UCODE_LOAD;
|
||||
task->arg = cz_translate_firmware_enum_to_arg(fw_enum);
|
||||
task->arg = cz_translate_firmware_enum_to_arg(smumgr, fw_enum);
|
||||
task->next = is_last ? END_OF_TASK_LIST : cz_smu->toc_entry_used_count;
|
||||
|
||||
for (i = 0; i < cz_smu->driver_buffer_length; i++)
|
||||
|
@ -509,8 +518,14 @@ static int cz_smu_construct_toc_for_vddgfx_exit(struct pp_smumgr *smumgr)
|
|||
CZ_SCRATCH_ENTRY_UCODE_ID_CP_ME, false);
|
||||
cz_smu_populate_single_ucode_load_task(smumgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT1, false);
|
||||
cz_smu_populate_single_ucode_load_task(smumgr,
|
||||
|
||||
if (smumgr->chip_id == CHIP_STONEY)
|
||||
cz_smu_populate_single_ucode_load_task(smumgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT1, false);
|
||||
else
|
||||
cz_smu_populate_single_ucode_load_task(smumgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT2, false);
|
||||
|
||||
cz_smu_populate_single_ucode_load_task(smumgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_RLC_G, false);
|
||||
|
||||
|
@ -551,7 +566,11 @@ static int cz_smu_construct_toc_for_bootup(struct pp_smumgr *smumgr)
|
|||
|
||||
cz_smu_populate_single_ucode_load_task(smumgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_SDMA0, false);
|
||||
cz_smu_populate_single_ucode_load_task(smumgr,
|
||||
if (smumgr->chip_id == CHIP_STONEY)
|
||||
cz_smu_populate_single_ucode_load_task(smumgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_SDMA0, false);
|
||||
else
|
||||
cz_smu_populate_single_ucode_load_task(smumgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_SDMA1, false);
|
||||
cz_smu_populate_single_ucode_load_task(smumgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_CP_CE, false);
|
||||
|
@ -561,7 +580,11 @@ static int cz_smu_construct_toc_for_bootup(struct pp_smumgr *smumgr)
|
|||
CZ_SCRATCH_ENTRY_UCODE_ID_CP_ME, false);
|
||||
cz_smu_populate_single_ucode_load_task(smumgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT1, false);
|
||||
cz_smu_populate_single_ucode_load_task(smumgr,
|
||||
if (smumgr->chip_id == CHIP_STONEY)
|
||||
cz_smu_populate_single_ucode_load_task(smumgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT1, false);
|
||||
else
|
||||
cz_smu_populate_single_ucode_load_task(smumgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT2, false);
|
||||
cz_smu_populate_single_ucode_load_task(smumgr,
|
||||
CZ_SCRATCH_ENTRY_UCODE_ID_RLC_G, true);
|
||||
|
@ -618,7 +641,7 @@ static int cz_smu_populate_firmware_entries(struct pp_smumgr *smumgr)
|
|||
|
||||
for (i = 0; i < sizeof(firmware_list)/sizeof(*firmware_list); i++) {
|
||||
|
||||
firmware_type = cz_translate_firmware_enum_to_arg(
|
||||
firmware_type = cz_translate_firmware_enum_to_arg(smumgr,
|
||||
firmware_list[i]);
|
||||
|
||||
ucode_id = cz_convert_fw_type_to_cgs(firmware_type);
|
||||
|
|
|
@ -946,9 +946,23 @@ static void wait_for_fences(struct drm_device *dev,
|
|||
}
|
||||
}
|
||||
|
||||
static bool framebuffer_changed(struct drm_device *dev,
|
||||
struct drm_atomic_state *old_state,
|
||||
struct drm_crtc *crtc)
|
||||
/**
|
||||
* drm_atomic_helper_framebuffer_changed - check if framebuffer has changed
|
||||
* @dev: DRM device
|
||||
* @old_state: atomic state object with old state structures
|
||||
* @crtc: DRM crtc
|
||||
*
|
||||
* Checks whether the framebuffer used for this CRTC changes as a result of
|
||||
* the atomic update. This is useful for drivers which cannot use
|
||||
* drm_atomic_helper_wait_for_vblanks() and need to reimplement its
|
||||
* functionality.
|
||||
*
|
||||
* Returns:
|
||||
* true if the framebuffer changed.
|
||||
*/
|
||||
bool drm_atomic_helper_framebuffer_changed(struct drm_device *dev,
|
||||
struct drm_atomic_state *old_state,
|
||||
struct drm_crtc *crtc)
|
||||
{
|
||||
struct drm_plane *plane;
|
||||
struct drm_plane_state *old_plane_state;
|
||||
|
@ -965,6 +979,7 @@ static bool framebuffer_changed(struct drm_device *dev,
|
|||
|
||||
return false;
|
||||
}
|
||||
EXPORT_SYMBOL(drm_atomic_helper_framebuffer_changed);
|
||||
|
||||
/**
|
||||
* drm_atomic_helper_wait_for_vblanks - wait for vblank on crtcs
|
||||
|
@ -999,7 +1014,8 @@ drm_atomic_helper_wait_for_vblanks(struct drm_device *dev,
|
|||
if (old_state->legacy_cursor_update)
|
||||
continue;
|
||||
|
||||
if (!framebuffer_changed(dev, old_state, crtc))
|
||||
if (!drm_atomic_helper_framebuffer_changed(dev,
|
||||
old_state, crtc))
|
||||
continue;
|
||||
|
||||
ret = drm_crtc_vblank_get(crtc);
|
||||
|
|
|
@ -8,8 +8,8 @@ This file was generated by the rules-ng-ng headergen tool in this git repository
|
|||
git clone git://0x04.net/rules-ng-ng
|
||||
|
||||
The rules-ng-ng source files this header was generated from are:
|
||||
- state_vg.xml ( 5973 bytes, from 2015-03-25 11:26:01)
|
||||
- common.xml ( 18437 bytes, from 2015-03-25 11:27:41)
|
||||
- state_hi.xml ( 24309 bytes, from 2015-12-12 09:02:53)
|
||||
- common.xml ( 18379 bytes, from 2015-12-12 09:02:53)
|
||||
|
||||
Copyright (C) 2015
|
||||
*/
|
||||
|
@ -30,15 +30,19 @@ Copyright (C) 2015
|
|||
#define ENDIAN_MODE_NO_SWAP 0x00000000
|
||||
#define ENDIAN_MODE_SWAP_16 0x00000001
|
||||
#define ENDIAN_MODE_SWAP_32 0x00000002
|
||||
#define chipModel_GC200 0x00000200
|
||||
#define chipModel_GC300 0x00000300
|
||||
#define chipModel_GC320 0x00000320
|
||||
#define chipModel_GC328 0x00000328
|
||||
#define chipModel_GC350 0x00000350
|
||||
#define chipModel_GC355 0x00000355
|
||||
#define chipModel_GC400 0x00000400
|
||||
#define chipModel_GC410 0x00000410
|
||||
#define chipModel_GC420 0x00000420
|
||||
#define chipModel_GC428 0x00000428
|
||||
#define chipModel_GC450 0x00000450
|
||||
#define chipModel_GC500 0x00000500
|
||||
#define chipModel_GC520 0x00000520
|
||||
#define chipModel_GC530 0x00000530
|
||||
#define chipModel_GC600 0x00000600
|
||||
#define chipModel_GC700 0x00000700
|
||||
|
@ -46,9 +50,16 @@ Copyright (C) 2015
|
|||
#define chipModel_GC860 0x00000860
|
||||
#define chipModel_GC880 0x00000880
|
||||
#define chipModel_GC1000 0x00001000
|
||||
#define chipModel_GC1500 0x00001500
|
||||
#define chipModel_GC2000 0x00002000
|
||||
#define chipModel_GC2100 0x00002100
|
||||
#define chipModel_GC2200 0x00002200
|
||||
#define chipModel_GC2500 0x00002500
|
||||
#define chipModel_GC3000 0x00003000
|
||||
#define chipModel_GC4000 0x00004000
|
||||
#define chipModel_GC5000 0x00005000
|
||||
#define chipModel_GC5200 0x00005200
|
||||
#define chipModel_GC6400 0x00006400
|
||||
#define RGBA_BITS_R 0x00000001
|
||||
#define RGBA_BITS_G 0x00000002
|
||||
#define RGBA_BITS_B 0x00000004
|
||||
|
@ -160,7 +171,7 @@ Copyright (C) 2015
|
|||
#define chipMinorFeatures2_UNK8 0x00000100
|
||||
#define chipMinorFeatures2_UNK9 0x00000200
|
||||
#define chipMinorFeatures2_UNK10 0x00000400
|
||||
#define chipMinorFeatures2_SAMPLERBASE_16 0x00000800
|
||||
#define chipMinorFeatures2_HALTI1 0x00000800
|
||||
#define chipMinorFeatures2_UNK12 0x00001000
|
||||
#define chipMinorFeatures2_UNK13 0x00002000
|
||||
#define chipMinorFeatures2_UNK14 0x00004000
|
||||
|
@ -189,7 +200,7 @@ Copyright (C) 2015
|
|||
#define chipMinorFeatures3_UNK5 0x00000020
|
||||
#define chipMinorFeatures3_UNK6 0x00000040
|
||||
#define chipMinorFeatures3_UNK7 0x00000080
|
||||
#define chipMinorFeatures3_UNK8 0x00000100
|
||||
#define chipMinorFeatures3_FAST_MSAA 0x00000100
|
||||
#define chipMinorFeatures3_UNK9 0x00000200
|
||||
#define chipMinorFeatures3_BUG_FIXES10 0x00000400
|
||||
#define chipMinorFeatures3_UNK11 0x00000800
|
||||
|
@ -199,7 +210,7 @@ Copyright (C) 2015
|
|||
#define chipMinorFeatures3_UNK15 0x00008000
|
||||
#define chipMinorFeatures3_UNK16 0x00010000
|
||||
#define chipMinorFeatures3_UNK17 0x00020000
|
||||
#define chipMinorFeatures3_UNK18 0x00040000
|
||||
#define chipMinorFeatures3_ACE 0x00040000
|
||||
#define chipMinorFeatures3_UNK19 0x00080000
|
||||
#define chipMinorFeatures3_UNK20 0x00100000
|
||||
#define chipMinorFeatures3_UNK21 0x00200000
|
||||
|
@ -207,7 +218,7 @@ Copyright (C) 2015
|
|||
#define chipMinorFeatures3_UNK23 0x00800000
|
||||
#define chipMinorFeatures3_UNK24 0x01000000
|
||||
#define chipMinorFeatures3_UNK25 0x02000000
|
||||
#define chipMinorFeatures3_UNK26 0x04000000
|
||||
#define chipMinorFeatures3_NEW_HZ 0x04000000
|
||||
#define chipMinorFeatures3_UNK27 0x08000000
|
||||
#define chipMinorFeatures3_UNK28 0x10000000
|
||||
#define chipMinorFeatures3_UNK29 0x20000000
|
||||
|
@ -229,9 +240,9 @@ Copyright (C) 2015
|
|||
#define chipMinorFeatures4_UNK13 0x00002000
|
||||
#define chipMinorFeatures4_UNK14 0x00004000
|
||||
#define chipMinorFeatures4_UNK15 0x00008000
|
||||
#define chipMinorFeatures4_UNK16 0x00010000
|
||||
#define chipMinorFeatures4_HALTI2 0x00010000
|
||||
#define chipMinorFeatures4_UNK17 0x00020000
|
||||
#define chipMinorFeatures4_UNK18 0x00040000
|
||||
#define chipMinorFeatures4_SMALL_MSAA 0x00040000
|
||||
#define chipMinorFeatures4_UNK19 0x00080000
|
||||
#define chipMinorFeatures4_UNK20 0x00100000
|
||||
#define chipMinorFeatures4_UNK21 0x00200000
|
||||
|
@ -245,5 +256,37 @@ Copyright (C) 2015
|
|||
#define chipMinorFeatures4_UNK29 0x20000000
|
||||
#define chipMinorFeatures4_UNK30 0x40000000
|
||||
#define chipMinorFeatures4_UNK31 0x80000000
|
||||
#define chipMinorFeatures5_UNK0 0x00000001
|
||||
#define chipMinorFeatures5_UNK1 0x00000002
|
||||
#define chipMinorFeatures5_UNK2 0x00000004
|
||||
#define chipMinorFeatures5_UNK3 0x00000008
|
||||
#define chipMinorFeatures5_UNK4 0x00000010
|
||||
#define chipMinorFeatures5_UNK5 0x00000020
|
||||
#define chipMinorFeatures5_UNK6 0x00000040
|
||||
#define chipMinorFeatures5_UNK7 0x00000080
|
||||
#define chipMinorFeatures5_UNK8 0x00000100
|
||||
#define chipMinorFeatures5_HALTI3 0x00000200
|
||||
#define chipMinorFeatures5_UNK10 0x00000400
|
||||
#define chipMinorFeatures5_UNK11 0x00000800
|
||||
#define chipMinorFeatures5_UNK12 0x00001000
|
||||
#define chipMinorFeatures5_UNK13 0x00002000
|
||||
#define chipMinorFeatures5_UNK14 0x00004000
|
||||
#define chipMinorFeatures5_UNK15 0x00008000
|
||||
#define chipMinorFeatures5_UNK16 0x00010000
|
||||
#define chipMinorFeatures5_UNK17 0x00020000
|
||||
#define chipMinorFeatures5_UNK18 0x00040000
|
||||
#define chipMinorFeatures5_UNK19 0x00080000
|
||||
#define chipMinorFeatures5_UNK20 0x00100000
|
||||
#define chipMinorFeatures5_UNK21 0x00200000
|
||||
#define chipMinorFeatures5_UNK22 0x00400000
|
||||
#define chipMinorFeatures5_UNK23 0x00800000
|
||||
#define chipMinorFeatures5_UNK24 0x01000000
|
||||
#define chipMinorFeatures5_UNK25 0x02000000
|
||||
#define chipMinorFeatures5_UNK26 0x04000000
|
||||
#define chipMinorFeatures5_UNK27 0x08000000
|
||||
#define chipMinorFeatures5_UNK28 0x10000000
|
||||
#define chipMinorFeatures5_UNK29 0x20000000
|
||||
#define chipMinorFeatures5_UNK30 0x40000000
|
||||
#define chipMinorFeatures5_UNK31 0x80000000
|
||||
|
||||
#endif /* COMMON_XML */
|
||||
|
|
|
@ -668,7 +668,6 @@ static struct platform_driver etnaviv_platform_driver = {
|
|||
.probe = etnaviv_pdev_probe,
|
||||
.remove = etnaviv_pdev_remove,
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "etnaviv",
|
||||
.of_match_table = dt_match,
|
||||
},
|
||||
|
|
|
@ -85,7 +85,7 @@ struct drm_gem_object *etnaviv_gem_prime_import_sg_table(struct drm_device *dev,
|
|||
struct dma_buf_attachment *attach, struct sg_table *sg);
|
||||
int etnaviv_gem_prime_pin(struct drm_gem_object *obj);
|
||||
void etnaviv_gem_prime_unpin(struct drm_gem_object *obj);
|
||||
void *etnaviv_gem_vaddr(struct drm_gem_object *obj);
|
||||
void *etnaviv_gem_vmap(struct drm_gem_object *obj);
|
||||
int etnaviv_gem_cpu_prep(struct drm_gem_object *obj, u32 op,
|
||||
struct timespec *timeout);
|
||||
int etnaviv_gem_cpu_fini(struct drm_gem_object *obj);
|
||||
|
|
|
@ -201,7 +201,9 @@ void etnaviv_core_dump(struct etnaviv_gpu *gpu)
|
|||
|
||||
obj = vram->object;
|
||||
|
||||
mutex_lock(&obj->lock);
|
||||
pages = etnaviv_gem_get_pages(obj);
|
||||
mutex_unlock(&obj->lock);
|
||||
if (pages) {
|
||||
int j;
|
||||
|
||||
|
@ -213,8 +215,8 @@ void etnaviv_core_dump(struct etnaviv_gpu *gpu)
|
|||
|
||||
iter.hdr->iova = cpu_to_le64(vram->iova);
|
||||
|
||||
vaddr = etnaviv_gem_vaddr(&obj->base);
|
||||
if (vaddr && !IS_ERR(vaddr))
|
||||
vaddr = etnaviv_gem_vmap(&obj->base);
|
||||
if (vaddr)
|
||||
memcpy(iter.data, vaddr, obj->base.size);
|
||||
|
||||
etnaviv_core_dump_header(&iter, ETDUMP_BUF_BO, iter.data +
|
||||
|
|
|
@ -353,25 +353,39 @@ void etnaviv_gem_put_iova(struct etnaviv_gpu *gpu, struct drm_gem_object *obj)
|
|||
drm_gem_object_unreference_unlocked(obj);
|
||||
}
|
||||
|
||||
void *etnaviv_gem_vaddr(struct drm_gem_object *obj)
|
||||
void *etnaviv_gem_vmap(struct drm_gem_object *obj)
|
||||
{
|
||||
struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj);
|
||||
|
||||
if (etnaviv_obj->vaddr)
|
||||
return etnaviv_obj->vaddr;
|
||||
|
||||
mutex_lock(&etnaviv_obj->lock);
|
||||
if (!etnaviv_obj->vaddr) {
|
||||
struct page **pages = etnaviv_gem_get_pages(etnaviv_obj);
|
||||
|
||||
if (IS_ERR(pages))
|
||||
return ERR_CAST(pages);
|
||||
|
||||
etnaviv_obj->vaddr = vmap(pages, obj->size >> PAGE_SHIFT,
|
||||
VM_MAP, pgprot_writecombine(PAGE_KERNEL));
|
||||
}
|
||||
/*
|
||||
* Need to check again, as we might have raced with another thread
|
||||
* while waiting for the mutex.
|
||||
*/
|
||||
if (!etnaviv_obj->vaddr)
|
||||
etnaviv_obj->vaddr = etnaviv_obj->ops->vmap(etnaviv_obj);
|
||||
mutex_unlock(&etnaviv_obj->lock);
|
||||
|
||||
return etnaviv_obj->vaddr;
|
||||
}
|
||||
|
||||
static void *etnaviv_gem_vmap_impl(struct etnaviv_gem_object *obj)
|
||||
{
|
||||
struct page **pages;
|
||||
|
||||
lockdep_assert_held(&obj->lock);
|
||||
|
||||
pages = etnaviv_gem_get_pages(obj);
|
||||
if (IS_ERR(pages))
|
||||
return NULL;
|
||||
|
||||
return vmap(pages, obj->base.size >> PAGE_SHIFT,
|
||||
VM_MAP, pgprot_writecombine(PAGE_KERNEL));
|
||||
}
|
||||
|
||||
static inline enum dma_data_direction etnaviv_op_to_dma_dir(u32 op)
|
||||
{
|
||||
if (op & ETNA_PREP_READ)
|
||||
|
@ -522,6 +536,7 @@ static void etnaviv_gem_shmem_release(struct etnaviv_gem_object *etnaviv_obj)
|
|||
static const struct etnaviv_gem_ops etnaviv_gem_shmem_ops = {
|
||||
.get_pages = etnaviv_gem_shmem_get_pages,
|
||||
.release = etnaviv_gem_shmem_release,
|
||||
.vmap = etnaviv_gem_vmap_impl,
|
||||
};
|
||||
|
||||
void etnaviv_gem_free_object(struct drm_gem_object *obj)
|
||||
|
@ -866,6 +881,7 @@ static void etnaviv_gem_userptr_release(struct etnaviv_gem_object *etnaviv_obj)
|
|||
static const struct etnaviv_gem_ops etnaviv_gem_userptr_ops = {
|
||||
.get_pages = etnaviv_gem_userptr_get_pages,
|
||||
.release = etnaviv_gem_userptr_release,
|
||||
.vmap = etnaviv_gem_vmap_impl,
|
||||
};
|
||||
|
||||
int etnaviv_gem_new_userptr(struct drm_device *dev, struct drm_file *file,
|
||||
|
|
|
@ -78,6 +78,7 @@ struct etnaviv_gem_object *to_etnaviv_bo(struct drm_gem_object *obj)
|
|||
struct etnaviv_gem_ops {
|
||||
int (*get_pages)(struct etnaviv_gem_object *);
|
||||
void (*release)(struct etnaviv_gem_object *);
|
||||
void *(*vmap)(struct etnaviv_gem_object *);
|
||||
};
|
||||
|
||||
static inline bool is_active(struct etnaviv_gem_object *etnaviv_obj)
|
||||
|
|
|
@ -31,7 +31,7 @@ struct sg_table *etnaviv_gem_prime_get_sg_table(struct drm_gem_object *obj)
|
|||
|
||||
void *etnaviv_gem_prime_vmap(struct drm_gem_object *obj)
|
||||
{
|
||||
return etnaviv_gem_vaddr(obj);
|
||||
return etnaviv_gem_vmap(obj);
|
||||
}
|
||||
|
||||
void etnaviv_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr)
|
||||
|
@ -77,9 +77,17 @@ static void etnaviv_gem_prime_release(struct etnaviv_gem_object *etnaviv_obj)
|
|||
drm_prime_gem_destroy(&etnaviv_obj->base, etnaviv_obj->sgt);
|
||||
}
|
||||
|
||||
static void *etnaviv_gem_prime_vmap_impl(struct etnaviv_gem_object *etnaviv_obj)
|
||||
{
|
||||
lockdep_assert_held(&etnaviv_obj->lock);
|
||||
|
||||
return dma_buf_vmap(etnaviv_obj->base.import_attach->dmabuf);
|
||||
}
|
||||
|
||||
static const struct etnaviv_gem_ops etnaviv_gem_prime_ops = {
|
||||
/* .get_pages should never be called */
|
||||
.release = etnaviv_gem_prime_release,
|
||||
.vmap = etnaviv_gem_prime_vmap_impl,
|
||||
};
|
||||
|
||||
struct drm_gem_object *etnaviv_gem_prime_import_sg_table(struct drm_device *dev,
|
||||
|
|
|
@ -72,6 +72,14 @@ int etnaviv_gpu_get_param(struct etnaviv_gpu *gpu, u32 param, u64 *value)
|
|||
*value = gpu->identity.minor_features3;
|
||||
break;
|
||||
|
||||
case ETNAVIV_PARAM_GPU_FEATURES_5:
|
||||
*value = gpu->identity.minor_features4;
|
||||
break;
|
||||
|
||||
case ETNAVIV_PARAM_GPU_FEATURES_6:
|
||||
*value = gpu->identity.minor_features5;
|
||||
break;
|
||||
|
||||
case ETNAVIV_PARAM_GPU_STREAM_COUNT:
|
||||
*value = gpu->identity.stream_count;
|
||||
break;
|
||||
|
@ -112,6 +120,10 @@ int etnaviv_gpu_get_param(struct etnaviv_gpu *gpu, u32 param, u64 *value)
|
|||
*value = gpu->identity.num_constants;
|
||||
break;
|
||||
|
||||
case ETNAVIV_PARAM_GPU_NUM_VARYINGS:
|
||||
*value = gpu->identity.varyings_count;
|
||||
break;
|
||||
|
||||
default:
|
||||
DBG("%s: invalid param: %u", dev_name(gpu->dev), param);
|
||||
return -EINVAL;
|
||||
|
@ -120,46 +132,56 @@ int etnaviv_gpu_get_param(struct etnaviv_gpu *gpu, u32 param, u64 *value)
|
|||
return 0;
|
||||
}
|
||||
|
||||
|
||||
#define etnaviv_is_model_rev(gpu, mod, rev) \
|
||||
((gpu)->identity.model == chipModel_##mod && \
|
||||
(gpu)->identity.revision == rev)
|
||||
#define etnaviv_field(val, field) \
|
||||
(((val) & field##__MASK) >> field##__SHIFT)
|
||||
|
||||
static void etnaviv_hw_specs(struct etnaviv_gpu *gpu)
|
||||
{
|
||||
if (gpu->identity.minor_features0 &
|
||||
chipMinorFeatures0_MORE_MINOR_FEATURES) {
|
||||
u32 specs[2];
|
||||
u32 specs[4];
|
||||
unsigned int streams;
|
||||
|
||||
specs[0] = gpu_read(gpu, VIVS_HI_CHIP_SPECS);
|
||||
specs[1] = gpu_read(gpu, VIVS_HI_CHIP_SPECS_2);
|
||||
specs[2] = gpu_read(gpu, VIVS_HI_CHIP_SPECS_3);
|
||||
specs[3] = gpu_read(gpu, VIVS_HI_CHIP_SPECS_4);
|
||||
|
||||
gpu->identity.stream_count =
|
||||
(specs[0] & VIVS_HI_CHIP_SPECS_STREAM_COUNT__MASK)
|
||||
>> VIVS_HI_CHIP_SPECS_STREAM_COUNT__SHIFT;
|
||||
gpu->identity.register_max =
|
||||
(specs[0] & VIVS_HI_CHIP_SPECS_REGISTER_MAX__MASK)
|
||||
>> VIVS_HI_CHIP_SPECS_REGISTER_MAX__SHIFT;
|
||||
gpu->identity.thread_count =
|
||||
(specs[0] & VIVS_HI_CHIP_SPECS_THREAD_COUNT__MASK)
|
||||
>> VIVS_HI_CHIP_SPECS_THREAD_COUNT__SHIFT;
|
||||
gpu->identity.vertex_cache_size =
|
||||
(specs[0] & VIVS_HI_CHIP_SPECS_VERTEX_CACHE_SIZE__MASK)
|
||||
>> VIVS_HI_CHIP_SPECS_VERTEX_CACHE_SIZE__SHIFT;
|
||||
gpu->identity.shader_core_count =
|
||||
(specs[0] & VIVS_HI_CHIP_SPECS_SHADER_CORE_COUNT__MASK)
|
||||
>> VIVS_HI_CHIP_SPECS_SHADER_CORE_COUNT__SHIFT;
|
||||
gpu->identity.pixel_pipes =
|
||||
(specs[0] & VIVS_HI_CHIP_SPECS_PIXEL_PIPES__MASK)
|
||||
>> VIVS_HI_CHIP_SPECS_PIXEL_PIPES__SHIFT;
|
||||
gpu->identity.stream_count = etnaviv_field(specs[0],
|
||||
VIVS_HI_CHIP_SPECS_STREAM_COUNT);
|
||||
gpu->identity.register_max = etnaviv_field(specs[0],
|
||||
VIVS_HI_CHIP_SPECS_REGISTER_MAX);
|
||||
gpu->identity.thread_count = etnaviv_field(specs[0],
|
||||
VIVS_HI_CHIP_SPECS_THREAD_COUNT);
|
||||
gpu->identity.vertex_cache_size = etnaviv_field(specs[0],
|
||||
VIVS_HI_CHIP_SPECS_VERTEX_CACHE_SIZE);
|
||||
gpu->identity.shader_core_count = etnaviv_field(specs[0],
|
||||
VIVS_HI_CHIP_SPECS_SHADER_CORE_COUNT);
|
||||
gpu->identity.pixel_pipes = etnaviv_field(specs[0],
|
||||
VIVS_HI_CHIP_SPECS_PIXEL_PIPES);
|
||||
gpu->identity.vertex_output_buffer_size =
|
||||
(specs[0] & VIVS_HI_CHIP_SPECS_VERTEX_OUTPUT_BUFFER_SIZE__MASK)
|
||||
>> VIVS_HI_CHIP_SPECS_VERTEX_OUTPUT_BUFFER_SIZE__SHIFT;
|
||||
etnaviv_field(specs[0],
|
||||
VIVS_HI_CHIP_SPECS_VERTEX_OUTPUT_BUFFER_SIZE);
|
||||
|
||||
gpu->identity.buffer_size =
|
||||
(specs[1] & VIVS_HI_CHIP_SPECS_2_BUFFER_SIZE__MASK)
|
||||
>> VIVS_HI_CHIP_SPECS_2_BUFFER_SIZE__SHIFT;
|
||||
gpu->identity.instruction_count =
|
||||
(specs[1] & VIVS_HI_CHIP_SPECS_2_INSTRUCTION_COUNT__MASK)
|
||||
>> VIVS_HI_CHIP_SPECS_2_INSTRUCTION_COUNT__SHIFT;
|
||||
gpu->identity.num_constants =
|
||||
(specs[1] & VIVS_HI_CHIP_SPECS_2_NUM_CONSTANTS__MASK)
|
||||
>> VIVS_HI_CHIP_SPECS_2_NUM_CONSTANTS__SHIFT;
|
||||
gpu->identity.buffer_size = etnaviv_field(specs[1],
|
||||
VIVS_HI_CHIP_SPECS_2_BUFFER_SIZE);
|
||||
gpu->identity.instruction_count = etnaviv_field(specs[1],
|
||||
VIVS_HI_CHIP_SPECS_2_INSTRUCTION_COUNT);
|
||||
gpu->identity.num_constants = etnaviv_field(specs[1],
|
||||
VIVS_HI_CHIP_SPECS_2_NUM_CONSTANTS);
|
||||
|
||||
gpu->identity.varyings_count = etnaviv_field(specs[2],
|
||||
VIVS_HI_CHIP_SPECS_3_VARYINGS_COUNT);
|
||||
|
||||
/* This overrides the value from older register if non-zero */
|
||||
streams = etnaviv_field(specs[3],
|
||||
VIVS_HI_CHIP_SPECS_4_STREAM_COUNT);
|
||||
if (streams)
|
||||
gpu->identity.stream_count = streams;
|
||||
}
|
||||
|
||||
/* Fill in the stream count if not specified */
|
||||
|
@ -173,7 +195,7 @@ static void etnaviv_hw_specs(struct etnaviv_gpu *gpu)
|
|||
/* Convert the register max value */
|
||||
if (gpu->identity.register_max)
|
||||
gpu->identity.register_max = 1 << gpu->identity.register_max;
|
||||
else if (gpu->identity.model == 0x0400)
|
||||
else if (gpu->identity.model == chipModel_GC400)
|
||||
gpu->identity.register_max = 32;
|
||||
else
|
||||
gpu->identity.register_max = 64;
|
||||
|
@ -181,10 +203,10 @@ static void etnaviv_hw_specs(struct etnaviv_gpu *gpu)
|
|||
/* Convert thread count */
|
||||
if (gpu->identity.thread_count)
|
||||
gpu->identity.thread_count = 1 << gpu->identity.thread_count;
|
||||
else if (gpu->identity.model == 0x0400)
|
||||
else if (gpu->identity.model == chipModel_GC400)
|
||||
gpu->identity.thread_count = 64;
|
||||
else if (gpu->identity.model == 0x0500 ||
|
||||
gpu->identity.model == 0x0530)
|
||||
else if (gpu->identity.model == chipModel_GC500 ||
|
||||
gpu->identity.model == chipModel_GC530)
|
||||
gpu->identity.thread_count = 128;
|
||||
else
|
||||
gpu->identity.thread_count = 256;
|
||||
|
@ -206,7 +228,7 @@ static void etnaviv_hw_specs(struct etnaviv_gpu *gpu)
|
|||
if (gpu->identity.vertex_output_buffer_size) {
|
||||
gpu->identity.vertex_output_buffer_size =
|
||||
1 << gpu->identity.vertex_output_buffer_size;
|
||||
} else if (gpu->identity.model == 0x0400) {
|
||||
} else if (gpu->identity.model == chipModel_GC400) {
|
||||
if (gpu->identity.revision < 0x4000)
|
||||
gpu->identity.vertex_output_buffer_size = 512;
|
||||
else if (gpu->identity.revision < 0x4200)
|
||||
|
@ -219,9 +241,8 @@ static void etnaviv_hw_specs(struct etnaviv_gpu *gpu)
|
|||
|
||||
switch (gpu->identity.instruction_count) {
|
||||
case 0:
|
||||
if ((gpu->identity.model == 0x2000 &&
|
||||
gpu->identity.revision == 0x5108) ||
|
||||
gpu->identity.model == 0x880)
|
||||
if (etnaviv_is_model_rev(gpu, GC2000, 0x5108) ||
|
||||
gpu->identity.model == chipModel_GC880)
|
||||
gpu->identity.instruction_count = 512;
|
||||
else
|
||||
gpu->identity.instruction_count = 256;
|
||||
|
@ -242,6 +263,30 @@ static void etnaviv_hw_specs(struct etnaviv_gpu *gpu)
|
|||
|
||||
if (gpu->identity.num_constants == 0)
|
||||
gpu->identity.num_constants = 168;
|
||||
|
||||
if (gpu->identity.varyings_count == 0) {
|
||||
if (gpu->identity.minor_features1 & chipMinorFeatures1_HALTI0)
|
||||
gpu->identity.varyings_count = 12;
|
||||
else
|
||||
gpu->identity.varyings_count = 8;
|
||||
}
|
||||
|
||||
/*
|
||||
* For some cores, two varyings are consumed for position, so the
|
||||
* maximum varying count needs to be reduced by one.
|
||||
*/
|
||||
if (etnaviv_is_model_rev(gpu, GC5000, 0x5434) ||
|
||||
etnaviv_is_model_rev(gpu, GC4000, 0x5222) ||
|
||||
etnaviv_is_model_rev(gpu, GC4000, 0x5245) ||
|
||||
etnaviv_is_model_rev(gpu, GC4000, 0x5208) ||
|
||||
etnaviv_is_model_rev(gpu, GC3000, 0x5435) ||
|
||||
etnaviv_is_model_rev(gpu, GC2200, 0x5244) ||
|
||||
etnaviv_is_model_rev(gpu, GC2100, 0x5108) ||
|
||||
etnaviv_is_model_rev(gpu, GC2000, 0x5108) ||
|
||||
etnaviv_is_model_rev(gpu, GC1500, 0x5246) ||
|
||||
etnaviv_is_model_rev(gpu, GC880, 0x5107) ||
|
||||
etnaviv_is_model_rev(gpu, GC880, 0x5106))
|
||||
gpu->identity.varyings_count -= 1;
|
||||
}
|
||||
|
||||
static void etnaviv_hw_identify(struct etnaviv_gpu *gpu)
|
||||
|
@ -251,12 +296,10 @@ static void etnaviv_hw_identify(struct etnaviv_gpu *gpu)
|
|||
chipIdentity = gpu_read(gpu, VIVS_HI_CHIP_IDENTITY);
|
||||
|
||||
/* Special case for older graphic cores. */
|
||||
if (((chipIdentity & VIVS_HI_CHIP_IDENTITY_FAMILY__MASK)
|
||||
>> VIVS_HI_CHIP_IDENTITY_FAMILY__SHIFT) == 0x01) {
|
||||
gpu->identity.model = 0x500; /* gc500 */
|
||||
gpu->identity.revision =
|
||||
(chipIdentity & VIVS_HI_CHIP_IDENTITY_REVISION__MASK)
|
||||
>> VIVS_HI_CHIP_IDENTITY_REVISION__SHIFT;
|
||||
if (etnaviv_field(chipIdentity, VIVS_HI_CHIP_IDENTITY_FAMILY) == 0x01) {
|
||||
gpu->identity.model = chipModel_GC500;
|
||||
gpu->identity.revision = etnaviv_field(chipIdentity,
|
||||
VIVS_HI_CHIP_IDENTITY_REVISION);
|
||||
} else {
|
||||
|
||||
gpu->identity.model = gpu_read(gpu, VIVS_HI_CHIP_MODEL);
|
||||
|
@ -269,13 +312,12 @@ static void etnaviv_hw_identify(struct etnaviv_gpu *gpu)
|
|||
* same. Only for GC400 family.
|
||||
*/
|
||||
if ((gpu->identity.model & 0xff00) == 0x0400 &&
|
||||
gpu->identity.model != 0x0420) {
|
||||
gpu->identity.model != chipModel_GC420) {
|
||||
gpu->identity.model = gpu->identity.model & 0x0400;
|
||||
}
|
||||
|
||||
/* Another special case */
|
||||
if (gpu->identity.model == 0x300 &&
|
||||
gpu->identity.revision == 0x2201) {
|
||||
if (etnaviv_is_model_rev(gpu, GC300, 0x2201)) {
|
||||
u32 chipDate = gpu_read(gpu, VIVS_HI_CHIP_DATE);
|
||||
u32 chipTime = gpu_read(gpu, VIVS_HI_CHIP_TIME);
|
||||
|
||||
|
@ -295,11 +337,13 @@ static void etnaviv_hw_identify(struct etnaviv_gpu *gpu)
|
|||
gpu->identity.features = gpu_read(gpu, VIVS_HI_CHIP_FEATURE);
|
||||
|
||||
/* Disable fast clear on GC700. */
|
||||
if (gpu->identity.model == 0x700)
|
||||
if (gpu->identity.model == chipModel_GC700)
|
||||
gpu->identity.features &= ~chipFeatures_FAST_CLEAR;
|
||||
|
||||
if ((gpu->identity.model == 0x500 && gpu->identity.revision < 2) ||
|
||||
(gpu->identity.model == 0x300 && gpu->identity.revision < 0x2000)) {
|
||||
if ((gpu->identity.model == chipModel_GC500 &&
|
||||
gpu->identity.revision < 2) ||
|
||||
(gpu->identity.model == chipModel_GC300 &&
|
||||
gpu->identity.revision < 0x2000)) {
|
||||
|
||||
/*
|
||||
* GC500 rev 1.x and GC300 rev < 2.0 doesn't have these
|
||||
|
@ -309,6 +353,8 @@ static void etnaviv_hw_identify(struct etnaviv_gpu *gpu)
|
|||
gpu->identity.minor_features1 = 0;
|
||||
gpu->identity.minor_features2 = 0;
|
||||
gpu->identity.minor_features3 = 0;
|
||||
gpu->identity.minor_features4 = 0;
|
||||
gpu->identity.minor_features5 = 0;
|
||||
} else
|
||||
gpu->identity.minor_features0 =
|
||||
gpu_read(gpu, VIVS_HI_CHIP_MINOR_FEATURE_0);
|
||||
|
@ -321,6 +367,10 @@ static void etnaviv_hw_identify(struct etnaviv_gpu *gpu)
|
|||
gpu_read(gpu, VIVS_HI_CHIP_MINOR_FEATURE_2);
|
||||
gpu->identity.minor_features3 =
|
||||
gpu_read(gpu, VIVS_HI_CHIP_MINOR_FEATURE_3);
|
||||
gpu->identity.minor_features4 =
|
||||
gpu_read(gpu, VIVS_HI_CHIP_MINOR_FEATURE_4);
|
||||
gpu->identity.minor_features5 =
|
||||
gpu_read(gpu, VIVS_HI_CHIP_MINOR_FEATURE_5);
|
||||
}
|
||||
|
||||
/* GC600 idle register reports zero bits where modules aren't present */
|
||||
|
@ -441,10 +491,9 @@ static void etnaviv_gpu_hw_init(struct etnaviv_gpu *gpu)
|
|||
{
|
||||
u16 prefetch;
|
||||
|
||||
if (gpu->identity.model == chipModel_GC320 &&
|
||||
gpu_read(gpu, VIVS_HI_CHIP_TIME) != 0x2062400 &&
|
||||
(gpu->identity.revision == 0x5007 ||
|
||||
gpu->identity.revision == 0x5220)) {
|
||||
if ((etnaviv_is_model_rev(gpu, GC320, 0x5007) ||
|
||||
etnaviv_is_model_rev(gpu, GC320, 0x5220)) &&
|
||||
gpu_read(gpu, VIVS_HI_CHIP_TIME) != 0x2062400) {
|
||||
u32 mc_memory_debug;
|
||||
|
||||
mc_memory_debug = gpu_read(gpu, VIVS_MC_DEBUG_MEMORY) & ~0xff;
|
||||
|
@ -466,7 +515,7 @@ static void etnaviv_gpu_hw_init(struct etnaviv_gpu *gpu)
|
|||
VIVS_HI_AXI_CONFIG_ARCACHE(2));
|
||||
|
||||
/* GC2000 rev 5108 needs a special bus config */
|
||||
if (gpu->identity.model == 0x2000 && gpu->identity.revision == 0x5108) {
|
||||
if (etnaviv_is_model_rev(gpu, GC2000, 0x5108)) {
|
||||
u32 bus_config = gpu_read(gpu, VIVS_MC_BUS_CONFIG);
|
||||
bus_config &= ~(VIVS_MC_BUS_CONFIG_FE_BUS_CONFIG__MASK |
|
||||
VIVS_MC_BUS_CONFIG_TX_BUS_CONFIG__MASK);
|
||||
|
@ -511,8 +560,16 @@ int etnaviv_gpu_init(struct etnaviv_gpu *gpu)
|
|||
|
||||
if (gpu->identity.model == 0) {
|
||||
dev_err(gpu->dev, "Unknown GPU model\n");
|
||||
pm_runtime_put_autosuspend(gpu->dev);
|
||||
return -ENXIO;
|
||||
ret = -ENXIO;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* Exclude VG cores with FE2.0 */
|
||||
if (gpu->identity.features & chipFeatures_PIPE_VG &&
|
||||
gpu->identity.features & chipFeatures_FE20) {
|
||||
dev_info(gpu->dev, "Ignoring GPU with VG and FE2.0\n");
|
||||
ret = -ENXIO;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
ret = etnaviv_hw_reset(gpu);
|
||||
|
@ -539,10 +596,9 @@ int etnaviv_gpu_init(struct etnaviv_gpu *gpu)
|
|||
goto fail;
|
||||
}
|
||||
|
||||
/* TODO: we will leak here memory - fix it! */
|
||||
|
||||
gpu->mmu = etnaviv_iommu_new(gpu, iommu, version);
|
||||
if (!gpu->mmu) {
|
||||
iommu_domain_free(iommu);
|
||||
ret = -ENOMEM;
|
||||
goto fail;
|
||||
}
|
||||
|
@ -552,7 +608,7 @@ int etnaviv_gpu_init(struct etnaviv_gpu *gpu)
|
|||
if (!gpu->buffer) {
|
||||
ret = -ENOMEM;
|
||||
dev_err(gpu->dev, "could not create command buffer\n");
|
||||
goto fail;
|
||||
goto destroy_iommu;
|
||||
}
|
||||
if (gpu->buffer->paddr - gpu->memory_base > 0x80000000) {
|
||||
ret = -EINVAL;
|
||||
|
@ -582,6 +638,9 @@ int etnaviv_gpu_init(struct etnaviv_gpu *gpu)
|
|||
free_buffer:
|
||||
etnaviv_gpu_cmdbuf_free(gpu->buffer);
|
||||
gpu->buffer = NULL;
|
||||
destroy_iommu:
|
||||
etnaviv_iommu_destroy(gpu->mmu);
|
||||
gpu->mmu = NULL;
|
||||
fail:
|
||||
pm_runtime_mark_last_busy(gpu->dev);
|
||||
pm_runtime_put_autosuspend(gpu->dev);
|
||||
|
@ -642,6 +701,10 @@ int etnaviv_gpu_debugfs(struct etnaviv_gpu *gpu, struct seq_file *m)
|
|||
gpu->identity.minor_features2);
|
||||
seq_printf(m, "\t minor_features3: 0x%08x\n",
|
||||
gpu->identity.minor_features3);
|
||||
seq_printf(m, "\t minor_features4: 0x%08x\n",
|
||||
gpu->identity.minor_features4);
|
||||
seq_printf(m, "\t minor_features5: 0x%08x\n",
|
||||
gpu->identity.minor_features5);
|
||||
|
||||
seq_puts(m, "\tspecs\n");
|
||||
seq_printf(m, "\t stream_count: %d\n",
|
||||
|
@ -664,6 +727,8 @@ int etnaviv_gpu_debugfs(struct etnaviv_gpu *gpu, struct seq_file *m)
|
|||
gpu->identity.instruction_count);
|
||||
seq_printf(m, "\t num_constants: %d\n",
|
||||
gpu->identity.num_constants);
|
||||
seq_printf(m, "\t varyings_count: %d\n",
|
||||
gpu->identity.varyings_count);
|
||||
|
||||
seq_printf(m, "\taxi: 0x%08x\n", axi);
|
||||
seq_printf(m, "\tidle: 0x%08x\n", idle);
|
||||
|
|
|
@ -46,6 +46,12 @@ struct etnaviv_chip_identity {
|
|||
/* Supported minor feature 3 fields. */
|
||||
u32 minor_features3;
|
||||
|
||||
/* Supported minor feature 4 fields. */
|
||||
u32 minor_features4;
|
||||
|
||||
/* Supported minor feature 5 fields. */
|
||||
u32 minor_features5;
|
||||
|
||||
/* Number of streams supported. */
|
||||
u32 stream_count;
|
||||
|
||||
|
@ -75,6 +81,9 @@ struct etnaviv_chip_identity {
|
|||
|
||||
/* Buffer size */
|
||||
u32 buffer_size;
|
||||
|
||||
/* Number of varyings */
|
||||
u8 varyings_count;
|
||||
};
|
||||
|
||||
struct etnaviv_event {
|
||||
|
|
|
@ -8,8 +8,8 @@ This file was generated by the rules-ng-ng headergen tool in this git repository
|
|||
git clone git://0x04.net/rules-ng-ng
|
||||
|
||||
The rules-ng-ng source files this header was generated from are:
|
||||
- state_hi.xml ( 23420 bytes, from 2015-03-25 11:47:21)
|
||||
- common.xml ( 18437 bytes, from 2015-03-25 11:27:41)
|
||||
- state_hi.xml ( 24309 bytes, from 2015-12-12 09:02:53)
|
||||
- common.xml ( 18437 bytes, from 2015-12-12 09:02:53)
|
||||
|
||||
Copyright (C) 2015
|
||||
*/
|
||||
|
@ -182,8 +182,25 @@ Copyright (C) 2015
|
|||
|
||||
#define VIVS_HI_CHIP_MINOR_FEATURE_3 0x00000088
|
||||
|
||||
#define VIVS_HI_CHIP_SPECS_3 0x0000008c
|
||||
#define VIVS_HI_CHIP_SPECS_3_VARYINGS_COUNT__MASK 0x000001f0
|
||||
#define VIVS_HI_CHIP_SPECS_3_VARYINGS_COUNT__SHIFT 4
|
||||
#define VIVS_HI_CHIP_SPECS_3_VARYINGS_COUNT(x) (((x) << VIVS_HI_CHIP_SPECS_3_VARYINGS_COUNT__SHIFT) & VIVS_HI_CHIP_SPECS_3_VARYINGS_COUNT__MASK)
|
||||
#define VIVS_HI_CHIP_SPECS_3_GPU_CORE_COUNT__MASK 0x00000007
|
||||
#define VIVS_HI_CHIP_SPECS_3_GPU_CORE_COUNT__SHIFT 0
|
||||
#define VIVS_HI_CHIP_SPECS_3_GPU_CORE_COUNT(x) (((x) << VIVS_HI_CHIP_SPECS_3_GPU_CORE_COUNT__SHIFT) & VIVS_HI_CHIP_SPECS_3_GPU_CORE_COUNT__MASK)
|
||||
|
||||
#define VIVS_HI_CHIP_MINOR_FEATURE_4 0x00000094
|
||||
|
||||
#define VIVS_HI_CHIP_SPECS_4 0x0000009c
|
||||
#define VIVS_HI_CHIP_SPECS_4_STREAM_COUNT__MASK 0x0001f000
|
||||
#define VIVS_HI_CHIP_SPECS_4_STREAM_COUNT__SHIFT 12
|
||||
#define VIVS_HI_CHIP_SPECS_4_STREAM_COUNT(x) (((x) << VIVS_HI_CHIP_SPECS_4_STREAM_COUNT__SHIFT) & VIVS_HI_CHIP_SPECS_4_STREAM_COUNT__MASK)
|
||||
|
||||
#define VIVS_HI_CHIP_MINOR_FEATURE_5 0x000000a0
|
||||
|
||||
#define VIVS_HI_CHIP_PRODUCT_ID 0x000000a8
|
||||
|
||||
#define VIVS_PM 0x00000000
|
||||
|
||||
#define VIVS_PM_POWER_CONTROLS 0x00000100
|
||||
|
@ -206,6 +223,11 @@ Copyright (C) 2015
|
|||
#define VIVS_PM_MODULE_STATUS_MODULE_CLOCK_GATED_FE 0x00000001
|
||||
#define VIVS_PM_MODULE_STATUS_MODULE_CLOCK_GATED_DE 0x00000002
|
||||
#define VIVS_PM_MODULE_STATUS_MODULE_CLOCK_GATED_PE 0x00000004
|
||||
#define VIVS_PM_MODULE_STATUS_MODULE_CLOCK_GATED_SH 0x00000008
|
||||
#define VIVS_PM_MODULE_STATUS_MODULE_CLOCK_GATED_PA 0x00000010
|
||||
#define VIVS_PM_MODULE_STATUS_MODULE_CLOCK_GATED_SE 0x00000020
|
||||
#define VIVS_PM_MODULE_STATUS_MODULE_CLOCK_GATED_RA 0x00000040
|
||||
#define VIVS_PM_MODULE_STATUS_MODULE_CLOCK_GATED_TX 0x00000080
|
||||
|
||||
#define VIVS_PM_PULSE_EATER 0x0000010c
|
||||
|
||||
|
|
|
@ -304,18 +304,10 @@ void dce6_dp_audio_set_dto(struct radeon_device *rdev,
|
|||
unsigned int div = (RREG32(DENTIST_DISPCLK_CNTL) &
|
||||
DENTIST_DPREFCLK_WDIVIDER_MASK) >>
|
||||
DENTIST_DPREFCLK_WDIVIDER_SHIFT;
|
||||
|
||||
if (div < 128 && div >= 96)
|
||||
div -= 64;
|
||||
else if (div >= 64)
|
||||
div = div / 2 - 16;
|
||||
else if (div >= 8)
|
||||
div /= 4;
|
||||
else
|
||||
div = 0;
|
||||
div = radeon_audio_decode_dfs_div(div);
|
||||
|
||||
if (div)
|
||||
clock = rdev->clock.gpupll_outputfreq * 10 / div;
|
||||
clock = clock * 100 / div;
|
||||
|
||||
WREG32(DCE8_DCCG_AUDIO_DTO1_PHASE, 24000);
|
||||
WREG32(DCE8_DCCG_AUDIO_DTO1_MODULE, clock);
|
||||
|
|
|
@ -289,6 +289,16 @@ void dce4_dp_audio_set_dto(struct radeon_device *rdev,
|
|||
* number (coefficient of two integer numbers. DCCG_AUDIO_DTOx_PHASE
|
||||
* is the numerator, DCCG_AUDIO_DTOx_MODULE is the denominator
|
||||
*/
|
||||
if (ASIC_IS_DCE41(rdev)) {
|
||||
unsigned int div = (RREG32(DCE41_DENTIST_DISPCLK_CNTL) &
|
||||
DENTIST_DPREFCLK_WDIVIDER_MASK) >>
|
||||
DENTIST_DPREFCLK_WDIVIDER_SHIFT;
|
||||
div = radeon_audio_decode_dfs_div(div);
|
||||
|
||||
if (div)
|
||||
clock = 100 * clock / div;
|
||||
}
|
||||
|
||||
WREG32(DCCG_AUDIO_DTO1_PHASE, 24000);
|
||||
WREG32(DCCG_AUDIO_DTO1_MODULE, clock);
|
||||
}
|
||||
|
|
|
@ -511,6 +511,11 @@
|
|||
#define DCCG_AUDIO_DTO1_CNTL 0x05cc
|
||||
# define DCCG_AUDIO_DTO1_USE_512FBR_DTO (1 << 3)
|
||||
|
||||
#define DCE41_DENTIST_DISPCLK_CNTL 0x049c
|
||||
# define DENTIST_DPREFCLK_WDIVIDER(x) (((x) & 0x7f) << 24)
|
||||
# define DENTIST_DPREFCLK_WDIVIDER_MASK (0x7f << 24)
|
||||
# define DENTIST_DPREFCLK_WDIVIDER_SHIFT 24
|
||||
|
||||
/* DCE 4.0 AFMT */
|
||||
#define HDMI_CONTROL 0x7030
|
||||
# define HDMI_KEEPOUT_MODE (1 << 0)
|
||||
|
|
|
@ -268,7 +268,7 @@ struct radeon_clock {
|
|||
uint32_t current_dispclk;
|
||||
uint32_t dp_extclk;
|
||||
uint32_t max_pixel_clock;
|
||||
uint32_t gpupll_outputfreq;
|
||||
uint32_t vco_freq;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -1106,6 +1106,31 @@ union firmware_info {
|
|||
ATOM_FIRMWARE_INFO_V2_2 info_22;
|
||||
};
|
||||
|
||||
union igp_info {
|
||||
struct _ATOM_INTEGRATED_SYSTEM_INFO info;
|
||||
struct _ATOM_INTEGRATED_SYSTEM_INFO_V2 info_2;
|
||||
struct _ATOM_INTEGRATED_SYSTEM_INFO_V6 info_6;
|
||||
struct _ATOM_INTEGRATED_SYSTEM_INFO_V1_7 info_7;
|
||||
struct _ATOM_INTEGRATED_SYSTEM_INFO_V1_8 info_8;
|
||||
};
|
||||
|
||||
static void radeon_atombios_get_dentist_vco_freq(struct radeon_device *rdev)
|
||||
{
|
||||
struct radeon_mode_info *mode_info = &rdev->mode_info;
|
||||
int index = GetIndexIntoMasterTable(DATA, IntegratedSystemInfo);
|
||||
union igp_info *igp_info;
|
||||
u8 frev, crev;
|
||||
u16 data_offset;
|
||||
|
||||
if (atom_parse_data_header(mode_info->atom_context, index, NULL,
|
||||
&frev, &crev, &data_offset)) {
|
||||
igp_info = (union igp_info *)(mode_info->atom_context->bios +
|
||||
data_offset);
|
||||
rdev->clock.vco_freq =
|
||||
le32_to_cpu(igp_info->info_6.ulDentistVCOFreq);
|
||||
}
|
||||
}
|
||||
|
||||
bool radeon_atom_get_clock_info(struct drm_device *dev)
|
||||
{
|
||||
struct radeon_device *rdev = dev->dev_private;
|
||||
|
@ -1257,12 +1282,18 @@ bool radeon_atom_get_clock_info(struct drm_device *dev)
|
|||
rdev->mode_info.firmware_flags =
|
||||
le16_to_cpu(firmware_info->info.usFirmwareCapability.susAccess);
|
||||
|
||||
if (ASIC_IS_DCE8(rdev)) {
|
||||
rdev->clock.gpupll_outputfreq =
|
||||
if (ASIC_IS_DCE8(rdev))
|
||||
rdev->clock.vco_freq =
|
||||
le32_to_cpu(firmware_info->info_22.ulGPUPLL_OutputFreq);
|
||||
if (rdev->clock.gpupll_outputfreq == 0)
|
||||
rdev->clock.gpupll_outputfreq = 360000; /* 3.6 GHz */
|
||||
}
|
||||
else if (ASIC_IS_DCE5(rdev))
|
||||
rdev->clock.vco_freq = rdev->clock.current_dispclk;
|
||||
else if (ASIC_IS_DCE41(rdev))
|
||||
radeon_atombios_get_dentist_vco_freq(rdev);
|
||||
else
|
||||
rdev->clock.vco_freq = rdev->clock.current_dispclk;
|
||||
|
||||
if (rdev->clock.vco_freq == 0)
|
||||
rdev->clock.vco_freq = 360000; /* 3.6 GHz */
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -1270,14 +1301,6 @@ bool radeon_atom_get_clock_info(struct drm_device *dev)
|
|||
return false;
|
||||
}
|
||||
|
||||
union igp_info {
|
||||
struct _ATOM_INTEGRATED_SYSTEM_INFO info;
|
||||
struct _ATOM_INTEGRATED_SYSTEM_INFO_V2 info_2;
|
||||
struct _ATOM_INTEGRATED_SYSTEM_INFO_V6 info_6;
|
||||
struct _ATOM_INTEGRATED_SYSTEM_INFO_V1_7 info_7;
|
||||
struct _ATOM_INTEGRATED_SYSTEM_INFO_V1_8 info_8;
|
||||
};
|
||||
|
||||
bool radeon_atombios_sideport_present(struct radeon_device *rdev)
|
||||
{
|
||||
struct radeon_mode_info *mode_info = &rdev->mode_info;
|
||||
|
|
|
@ -739,9 +739,6 @@ static void radeon_audio_dp_mode_set(struct drm_encoder *encoder,
|
|||
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
|
||||
struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
|
||||
struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
|
||||
struct radeon_connector *radeon_connector = to_radeon_connector(connector);
|
||||
struct radeon_connector_atom_dig *dig_connector =
|
||||
radeon_connector->con_priv;
|
||||
|
||||
if (!dig || !dig->afmt)
|
||||
return;
|
||||
|
@ -753,10 +750,7 @@ static void radeon_audio_dp_mode_set(struct drm_encoder *encoder,
|
|||
radeon_audio_write_speaker_allocation(encoder);
|
||||
radeon_audio_write_sad_regs(encoder);
|
||||
radeon_audio_write_latency_fields(encoder, mode);
|
||||
if (rdev->clock.dp_extclk || ASIC_IS_DCE5(rdev))
|
||||
radeon_audio_set_dto(encoder, rdev->clock.default_dispclk * 10);
|
||||
else
|
||||
radeon_audio_set_dto(encoder, dig_connector->dp_clock);
|
||||
radeon_audio_set_dto(encoder, rdev->clock.vco_freq * 10);
|
||||
radeon_audio_set_audio_packet(encoder);
|
||||
radeon_audio_select_pin(encoder);
|
||||
|
||||
|
@ -781,3 +775,15 @@ void radeon_audio_dpms(struct drm_encoder *encoder, int mode)
|
|||
if (radeon_encoder->audio && radeon_encoder->audio->dpms)
|
||||
radeon_encoder->audio->dpms(encoder, mode == DRM_MODE_DPMS_ON);
|
||||
}
|
||||
|
||||
unsigned int radeon_audio_decode_dfs_div(unsigned int div)
|
||||
{
|
||||
if (div >= 8 && div < 64)
|
||||
return (div - 8) * 25 + 200;
|
||||
else if (div >= 64 && div < 96)
|
||||
return (div - 64) * 50 + 1600;
|
||||
else if (div >= 96 && div < 128)
|
||||
return (div - 96) * 100 + 3200;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -79,5 +79,6 @@ void radeon_audio_fini(struct radeon_device *rdev);
|
|||
void radeon_audio_mode_set(struct drm_encoder *encoder,
|
||||
struct drm_display_mode *mode);
|
||||
void radeon_audio_dpms(struct drm_encoder *encoder, int mode);
|
||||
unsigned int radeon_audio_decode_dfs_div(unsigned int div);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1670,8 +1670,10 @@ int radeon_modeset_init(struct radeon_device *rdev)
|
|||
/* setup afmt */
|
||||
radeon_afmt_init(rdev);
|
||||
|
||||
radeon_fbdev_init(rdev);
|
||||
drm_kms_helper_poll_init(rdev->ddev);
|
||||
if (!list_empty(&rdev->ddev->mode_config.connector_list)) {
|
||||
radeon_fbdev_init(rdev);
|
||||
drm_kms_helper_poll_init(rdev->ddev);
|
||||
}
|
||||
|
||||
/* do pm late init */
|
||||
ret = radeon_pm_late_init(rdev);
|
||||
|
|
|
@ -663,6 +663,7 @@ int radeon_gem_va_ioctl(struct drm_device *dev, void *data,
|
|||
bo_va = radeon_vm_bo_find(&fpriv->vm, rbo);
|
||||
if (!bo_va) {
|
||||
args->operation = RADEON_VA_RESULT_ERROR;
|
||||
radeon_bo_unreserve(rbo);
|
||||
drm_gem_object_unreference_unlocked(gobj);
|
||||
return -ENOENT;
|
||||
}
|
||||
|
|
|
@ -178,12 +178,12 @@ int vce_v1_0_load_fw(struct radeon_device *rdev, uint32_t *data)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
for (i = 0; i < sign->num; ++i) {
|
||||
if (sign->val[i].chip_id == chip_id)
|
||||
for (i = 0; i < le32_to_cpu(sign->num); ++i) {
|
||||
if (le32_to_cpu(sign->val[i].chip_id) == chip_id)
|
||||
break;
|
||||
}
|
||||
|
||||
if (i == sign->num)
|
||||
if (i == le32_to_cpu(sign->num))
|
||||
return -EINVAL;
|
||||
|
||||
data += (256 - 64) / 4;
|
||||
|
@ -191,18 +191,18 @@ int vce_v1_0_load_fw(struct radeon_device *rdev, uint32_t *data)
|
|||
data[1] = sign->val[i].nonce[1];
|
||||
data[2] = sign->val[i].nonce[2];
|
||||
data[3] = sign->val[i].nonce[3];
|
||||
data[4] = sign->len + 64;
|
||||
data[4] = cpu_to_le32(le32_to_cpu(sign->len) + 64);
|
||||
|
||||
memset(&data[5], 0, 44);
|
||||
memcpy(&data[16], &sign[1], rdev->vce_fw->size - sizeof(*sign));
|
||||
|
||||
data += data[4] / 4;
|
||||
data += le32_to_cpu(data[4]) / 4;
|
||||
data[0] = sign->val[i].sigval[0];
|
||||
data[1] = sign->val[i].sigval[1];
|
||||
data[2] = sign->val[i].sigval[2];
|
||||
data[3] = sign->val[i].sigval[3];
|
||||
|
||||
rdev->vce.keyselect = sign->val[i].keyselect;
|
||||
rdev->vce.keyselect = le32_to_cpu(sign->val[i].keyselect);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -2,11 +2,11 @@
|
|||
# Makefile for the drm device driver. This driver provides support for the
|
||||
# Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher.
|
||||
|
||||
rockchipdrm-y := rockchip_drm_drv.o rockchip_drm_fb.o rockchip_drm_fbdev.o \
|
||||
rockchip_drm_gem.o
|
||||
rockchipdrm-y := rockchip_drm_drv.o rockchip_drm_fb.o \
|
||||
rockchip_drm_gem.o rockchip_drm_vop.o
|
||||
rockchipdrm-$(CONFIG_DRM_FBDEV_EMULATION) += rockchip_drm_fbdev.o
|
||||
|
||||
obj-$(CONFIG_ROCKCHIP_DW_HDMI) += dw_hdmi-rockchip.o
|
||||
obj-$(CONFIG_ROCKCHIP_DW_MIPI_DSI) += dw-mipi-dsi.o
|
||||
|
||||
obj-$(CONFIG_DRM_ROCKCHIP) += rockchipdrm.o rockchip_drm_vop.o \
|
||||
rockchip_vop_reg.o
|
||||
obj-$(CONFIG_DRM_ROCKCHIP) += rockchipdrm.o rockchip_vop_reg.o
|
||||
|
|
|
@ -461,10 +461,11 @@ static int dw_mipi_dsi_phy_init(struct dw_mipi_dsi *dsi)
|
|||
|
||||
static int dw_mipi_dsi_get_lane_bps(struct dw_mipi_dsi *dsi)
|
||||
{
|
||||
unsigned int bpp, i, pre;
|
||||
unsigned int i, pre;
|
||||
unsigned long mpclk, pllref, tmp;
|
||||
unsigned int m = 1, n = 1, target_mbps = 1000;
|
||||
unsigned int max_mbps = dptdin_map[ARRAY_SIZE(dptdin_map) - 1].max_mbps;
|
||||
int bpp;
|
||||
|
||||
bpp = mipi_dsi_pixel_format_to_bpp(dsi->format);
|
||||
if (bpp < 0) {
|
||||
|
|
|
@ -55,14 +55,12 @@ int rockchip_drm_dma_attach_device(struct drm_device *drm_dev,
|
|||
|
||||
return arm_iommu_attach_device(dev, mapping);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rockchip_drm_dma_attach_device);
|
||||
|
||||
void rockchip_drm_dma_detach_device(struct drm_device *drm_dev,
|
||||
struct device *dev)
|
||||
{
|
||||
arm_iommu_detach_device(dev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rockchip_drm_dma_detach_device);
|
||||
|
||||
int rockchip_register_crtc_funcs(struct drm_crtc *crtc,
|
||||
const struct rockchip_crtc_funcs *crtc_funcs)
|
||||
|
@ -77,7 +75,6 @@ int rockchip_register_crtc_funcs(struct drm_crtc *crtc,
|
|||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rockchip_register_crtc_funcs);
|
||||
|
||||
void rockchip_unregister_crtc_funcs(struct drm_crtc *crtc)
|
||||
{
|
||||
|
@ -89,7 +86,6 @@ void rockchip_unregister_crtc_funcs(struct drm_crtc *crtc)
|
|||
|
||||
priv->crtc_funcs[pipe] = NULL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rockchip_unregister_crtc_funcs);
|
||||
|
||||
static struct drm_crtc *rockchip_crtc_from_pipe(struct drm_device *drm,
|
||||
int pipe)
|
||||
|
|
|
@ -39,7 +39,6 @@ struct drm_gem_object *rockchip_fb_get_gem_obj(struct drm_framebuffer *fb,
|
|||
|
||||
return rk_fb->obj[plane];
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rockchip_fb_get_gem_obj);
|
||||
|
||||
static void rockchip_drm_fb_destroy(struct drm_framebuffer *fb)
|
||||
{
|
||||
|
@ -177,8 +176,23 @@ static void rockchip_crtc_wait_for_update(struct drm_crtc *crtc)
|
|||
crtc_funcs->wait_for_update(crtc);
|
||||
}
|
||||
|
||||
/*
|
||||
* We can't use drm_atomic_helper_wait_for_vblanks() because rk3288 and rk3066
|
||||
* have hardware counters for neither vblanks nor scanlines, which results in
|
||||
* a race where:
|
||||
* | <-- HW vsync irq and reg take effect
|
||||
* plane_commit --> |
|
||||
* get_vblank and wait --> |
|
||||
* | <-- handle_vblank, vblank->count + 1
|
||||
* cleanup_fb --> |
|
||||
* iommu crash --> |
|
||||
* | <-- HW vsync irq and reg take effect
|
||||
*
|
||||
* This function is equivalent but uses rockchip_crtc_wait_for_update() instead
|
||||
* of waiting for vblank_count to change.
|
||||
*/
|
||||
static void
|
||||
rockchip_atomic_wait_for_complete(struct drm_atomic_state *old_state)
|
||||
rockchip_atomic_wait_for_complete(struct drm_device *dev, struct drm_atomic_state *old_state)
|
||||
{
|
||||
struct drm_crtc_state *old_crtc_state;
|
||||
struct drm_crtc *crtc;
|
||||
|
@ -194,6 +208,10 @@ rockchip_atomic_wait_for_complete(struct drm_atomic_state *old_state)
|
|||
if (!crtc->state->active)
|
||||
continue;
|
||||
|
||||
if (!drm_atomic_helper_framebuffer_changed(dev,
|
||||
old_state, crtc))
|
||||
continue;
|
||||
|
||||
ret = drm_crtc_vblank_get(crtc);
|
||||
if (ret != 0)
|
||||
continue;
|
||||
|
@ -241,7 +259,7 @@ rockchip_atomic_commit_complete(struct rockchip_atomic_commit *commit)
|
|||
|
||||
drm_atomic_helper_commit_planes(dev, state, true);
|
||||
|
||||
rockchip_atomic_wait_for_complete(state);
|
||||
rockchip_atomic_wait_for_complete(dev, state);
|
||||
|
||||
drm_atomic_helper_cleanup_planes(dev, state);
|
||||
|
||||
|
|
|
@ -15,7 +15,18 @@
|
|||
#ifndef _ROCKCHIP_DRM_FBDEV_H
|
||||
#define _ROCKCHIP_DRM_FBDEV_H
|
||||
|
||||
#ifdef CONFIG_DRM_FBDEV_EMULATION
|
||||
int rockchip_drm_fbdev_init(struct drm_device *dev);
|
||||
void rockchip_drm_fbdev_fini(struct drm_device *dev);
|
||||
#else
|
||||
static inline int rockchip_drm_fbdev_init(struct drm_device *dev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void rockchip_drm_fbdev_fini(struct drm_device *dev)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _ROCKCHIP_DRM_FBDEV_H */
|
||||
|
|
|
@ -234,13 +234,8 @@ int rockchip_gem_dumb_create(struct drm_file *file_priv,
|
|||
/*
|
||||
* align to 64 bytes since Mali requires it.
|
||||
*/
|
||||
min_pitch = ALIGN(min_pitch, 64);
|
||||
|
||||
if (args->pitch < min_pitch)
|
||||
args->pitch = min_pitch;
|
||||
|
||||
if (args->size < args->pitch * args->height)
|
||||
args->size = args->pitch * args->height;
|
||||
args->pitch = ALIGN(min_pitch, 64);
|
||||
args->size = args->pitch * args->height;
|
||||
|
||||
rk_obj = rockchip_gem_create_with_handle(file_priv, dev, args->size,
|
||||
&args->handle);
|
||||
|
|
|
@ -43,8 +43,8 @@
|
|||
|
||||
#define REG_SET(x, base, reg, v, mode) \
|
||||
__REG_SET_##mode(x, base + reg.offset, reg.mask, reg.shift, v)
|
||||
#define REG_SET_MASK(x, base, reg, v, mode) \
|
||||
__REG_SET_##mode(x, base + reg.offset, reg.mask, reg.shift, v)
|
||||
#define REG_SET_MASK(x, base, reg, mask, v, mode) \
|
||||
__REG_SET_##mode(x, base + reg.offset, mask, reg.shift, v)
|
||||
|
||||
#define VOP_WIN_SET(x, win, name, v) \
|
||||
REG_SET(x, win->base, win->phy->name, v, RELAXED)
|
||||
|
@ -58,16 +58,18 @@
|
|||
#define VOP_INTR_GET(vop, name) \
|
||||
vop_read_reg(vop, 0, &vop->data->ctrl->name)
|
||||
|
||||
#define VOP_INTR_SET(vop, name, v) \
|
||||
REG_SET(vop, 0, vop->data->intr->name, v, NORMAL)
|
||||
#define VOP_INTR_SET(vop, name, mask, v) \
|
||||
REG_SET_MASK(vop, 0, vop->data->intr->name, mask, v, NORMAL)
|
||||
#define VOP_INTR_SET_TYPE(vop, name, type, v) \
|
||||
do { \
|
||||
int i, reg = 0; \
|
||||
int i, reg = 0, mask = 0; \
|
||||
for (i = 0; i < vop->data->intr->nintrs; i++) { \
|
||||
if (vop->data->intr->intrs[i] & type) \
|
||||
if (vop->data->intr->intrs[i] & type) { \
|
||||
reg |= (v) << i; \
|
||||
mask |= 1 << i; \
|
||||
} \
|
||||
} \
|
||||
VOP_INTR_SET(vop, name, reg); \
|
||||
VOP_INTR_SET(vop, name, mask, reg); \
|
||||
} while (0)
|
||||
#define VOP_INTR_GET_TYPE(vop, name, type) \
|
||||
vop_get_intr_type(vop, &vop->data->intr->name, type)
|
||||
|
|
|
@ -144,19 +144,16 @@ int vc4_v3d_debugfs_ident(struct seq_file *m, void *unused)
|
|||
}
|
||||
#endif /* CONFIG_DEBUG_FS */
|
||||
|
||||
/*
|
||||
* Asks the firmware to turn on power to the V3D engine.
|
||||
*
|
||||
* This may be doable with just the clocks interface, though this
|
||||
* packet does some other register setup from the firmware, too.
|
||||
*/
|
||||
int
|
||||
vc4_v3d_set_power(struct vc4_dev *vc4, bool on)
|
||||
{
|
||||
if (on)
|
||||
return pm_generic_poweroff(&vc4->v3d->pdev->dev);
|
||||
else
|
||||
return pm_generic_resume(&vc4->v3d->pdev->dev);
|
||||
/* XXX: This interface is needed for GPU reset, and the way to
|
||||
* do it is to turn our power domain off and back on. We
|
||||
* can't just reset from within the driver, because the reset
|
||||
* bits are in the power domain's register area, and get set
|
||||
* during the poweron process.
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void vc4_v3d_init_hw(struct drm_device *dev)
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
*
|
||||
**************************************************************************/
|
||||
#include <linux/module.h>
|
||||
#include <linux/console.h>
|
||||
|
||||
#include <drm/drmP.h>
|
||||
#include "vmwgfx_drv.h"
|
||||
|
@ -1538,6 +1539,12 @@ static int vmw_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
static int __init vmwgfx_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
#ifdef CONFIG_VGA_CONSOLE
|
||||
if (vgacon_text_force())
|
||||
return -EINVAL;
|
||||
#endif
|
||||
|
||||
ret = drm_pci_init(&driver, &vmw_pci_driver);
|
||||
if (ret)
|
||||
DRM_ERROR("Failed initializing DRM.\n");
|
||||
|
|
|
@ -42,6 +42,10 @@ int drm_atomic_helper_commit(struct drm_device *dev,
|
|||
struct drm_atomic_state *state,
|
||||
bool async);
|
||||
|
||||
bool drm_atomic_helper_framebuffer_changed(struct drm_device *dev,
|
||||
struct drm_atomic_state *old_state,
|
||||
struct drm_crtc *crtc);
|
||||
|
||||
void drm_atomic_helper_wait_for_vblanks(struct drm_device *dev,
|
||||
struct drm_atomic_state *old_state);
|
||||
|
||||
|
|
|
@ -48,6 +48,8 @@ struct drm_etnaviv_timespec {
|
|||
#define ETNAVIV_PARAM_GPU_FEATURES_2 0x05
|
||||
#define ETNAVIV_PARAM_GPU_FEATURES_3 0x06
|
||||
#define ETNAVIV_PARAM_GPU_FEATURES_4 0x07
|
||||
#define ETNAVIV_PARAM_GPU_FEATURES_5 0x08
|
||||
#define ETNAVIV_PARAM_GPU_FEATURES_6 0x09
|
||||
|
||||
#define ETNAVIV_PARAM_GPU_STREAM_COUNT 0x10
|
||||
#define ETNAVIV_PARAM_GPU_REGISTER_MAX 0x11
|
||||
|
@ -59,6 +61,7 @@ struct drm_etnaviv_timespec {
|
|||
#define ETNAVIV_PARAM_GPU_BUFFER_SIZE 0x17
|
||||
#define ETNAVIV_PARAM_GPU_INSTRUCTION_COUNT 0x18
|
||||
#define ETNAVIV_PARAM_GPU_NUM_CONSTANTS 0x19
|
||||
#define ETNAVIV_PARAM_GPU_NUM_VARYINGS 0x1a
|
||||
|
||||
#define ETNA_MAX_PIPES 4
|
||||
|
||||
|
|
Loading…
Reference in New Issue