diff options
| -rw-r--r-- | drivers/gpu/drm/radeon/atombios_encoders.c | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/evergreen_cs.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/ni.c | 45 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/nid.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_atpx_handler.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_device.c | 60 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_gart.c | 22 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_gem.c | 18 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_legacy_encoders.c | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_object.c | 19 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/si.c | 47 | ||||
| -rw-r--r-- | include/drm/drm_pciids.h | 3 |
12 files changed, 122 insertions, 110 deletions
diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c index 49cbb3795a10..ba498f8e47a2 100644 --- a/drivers/gpu/drm/radeon/atombios_encoders.c +++ b/drivers/gpu/drm/radeon/atombios_encoders.c | |||
| @@ -184,6 +184,7 @@ void radeon_atom_backlight_init(struct radeon_encoder *radeon_encoder, | |||
| 184 | struct radeon_backlight_privdata *pdata; | 184 | struct radeon_backlight_privdata *pdata; |
| 185 | struct radeon_encoder_atom_dig *dig; | 185 | struct radeon_encoder_atom_dig *dig; |
| 186 | u8 backlight_level; | 186 | u8 backlight_level; |
| 187 | char bl_name[16]; | ||
| 187 | 188 | ||
| 188 | if (!radeon_encoder->enc_priv) | 189 | if (!radeon_encoder->enc_priv) |
| 189 | return; | 190 | return; |
| @@ -203,7 +204,9 @@ void radeon_atom_backlight_init(struct radeon_encoder *radeon_encoder, | |||
| 203 | memset(&props, 0, sizeof(props)); | 204 | memset(&props, 0, sizeof(props)); |
| 204 | props.max_brightness = RADEON_MAX_BL_LEVEL; | 205 | props.max_brightness = RADEON_MAX_BL_LEVEL; |
| 205 | props.type = BACKLIGHT_RAW; | 206 | props.type = BACKLIGHT_RAW; |
| 206 | bd = backlight_device_register("radeon_bl", &drm_connector->kdev, | 207 | snprintf(bl_name, sizeof(bl_name), |
| 208 | "radeon_bl%d", dev->primary->index); | ||
| 209 | bd = backlight_device_register(bl_name, &drm_connector->kdev, | ||
| 207 | pdata, &radeon_atom_backlight_ops, &props); | 210 | pdata, &radeon_atom_backlight_ops, &props); |
| 208 | if (IS_ERR(bd)) { | 211 | if (IS_ERR(bd)) { |
| 209 | DRM_ERROR("Backlight registration failed\n"); | 212 | DRM_ERROR("Backlight registration failed\n"); |
diff --git a/drivers/gpu/drm/radeon/evergreen_cs.c b/drivers/gpu/drm/radeon/evergreen_cs.c index 573ed1bc6cf7..30271b641913 100644 --- a/drivers/gpu/drm/radeon/evergreen_cs.c +++ b/drivers/gpu/drm/radeon/evergreen_cs.c | |||
| @@ -2829,6 +2829,7 @@ static bool evergreen_vm_reg_valid(u32 reg) | |||
| 2829 | case CAYMAN_SQ_EX_ALLOC_TABLE_SLOTS: | 2829 | case CAYMAN_SQ_EX_ALLOC_TABLE_SLOTS: |
| 2830 | return true; | 2830 | return true; |
| 2831 | default: | 2831 | default: |
| 2832 | DRM_ERROR("Invalid register 0x%x in CS\n", reg); | ||
| 2832 | return false; | 2833 | return false; |
| 2833 | } | 2834 | } |
| 2834 | } | 2835 | } |
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c index 8c74c729586d..81e6a568c29d 100644 --- a/drivers/gpu/drm/radeon/ni.c +++ b/drivers/gpu/drm/radeon/ni.c | |||
| @@ -1538,26 +1538,31 @@ void cayman_vm_set_page(struct radeon_device *rdev, uint64_t pe, | |||
| 1538 | { | 1538 | { |
| 1539 | struct radeon_ring *ring = &rdev->ring[rdev->asic->vm.pt_ring_index]; | 1539 | struct radeon_ring *ring = &rdev->ring[rdev->asic->vm.pt_ring_index]; |
| 1540 | uint32_t r600_flags = cayman_vm_page_flags(rdev, flags); | 1540 | uint32_t r600_flags = cayman_vm_page_flags(rdev, flags); |
| 1541 | int i; | ||
| 1542 | 1541 | ||
| 1543 | radeon_ring_write(ring, PACKET3(PACKET3_ME_WRITE, 1 + count * 2)); | 1542 | while (count) { |
| 1544 | radeon_ring_write(ring, pe); | 1543 | unsigned ndw = 1 + count * 2; |
| 1545 | radeon_ring_write(ring, upper_32_bits(pe) & 0xff); | 1544 | if (ndw > 0x3FFF) |
| 1546 | for (i = 0; i < count; ++i) { | 1545 | ndw = 0x3FFF; |
| 1547 | uint64_t value = 0; | 1546 | |
| 1548 | if (flags & RADEON_VM_PAGE_SYSTEM) { | 1547 | radeon_ring_write(ring, PACKET3(PACKET3_ME_WRITE, ndw)); |
| 1549 | value = radeon_vm_map_gart(rdev, addr); | 1548 | radeon_ring_write(ring, pe); |
| 1550 | value &= 0xFFFFFFFFFFFFF000ULL; | 1549 | radeon_ring_write(ring, upper_32_bits(pe) & 0xff); |
| 1551 | addr += incr; | 1550 | for (; ndw > 1; ndw -= 2, --count, pe += 8) { |
| 1552 | 1551 | uint64_t value = 0; | |
| 1553 | } else if (flags & RADEON_VM_PAGE_VALID) { | 1552 | if (flags & RADEON_VM_PAGE_SYSTEM) { |
| 1554 | value = addr; | 1553 | value = radeon_vm_map_gart(rdev, addr); |
| 1555 | addr += incr; | 1554 | value &= 0xFFFFFFFFFFFFF000ULL; |
| 1556 | } | 1555 | addr += incr; |
| 1556 | |||
| 1557 | } else if (flags & RADEON_VM_PAGE_VALID) { | ||
| 1558 | value = addr; | ||
| 1559 | addr += incr; | ||
| 1560 | } | ||
| 1557 | 1561 | ||
| 1558 | value |= r600_flags; | 1562 | value |= r600_flags; |
| 1559 | radeon_ring_write(ring, value); | 1563 | radeon_ring_write(ring, value); |
| 1560 | radeon_ring_write(ring, upper_32_bits(value)); | 1564 | radeon_ring_write(ring, upper_32_bits(value)); |
| 1565 | } | ||
| 1561 | } | 1566 | } |
| 1562 | } | 1567 | } |
| 1563 | 1568 | ||
| @@ -1586,4 +1591,8 @@ void cayman_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm) | |||
| 1586 | /* bits 0-7 are the VM contexts0-7 */ | 1591 | /* bits 0-7 are the VM contexts0-7 */ |
| 1587 | radeon_ring_write(ring, PACKET0(VM_INVALIDATE_REQUEST, 0)); | 1592 | radeon_ring_write(ring, PACKET0(VM_INVALIDATE_REQUEST, 0)); |
| 1588 | radeon_ring_write(ring, 1 << vm->id); | 1593 | radeon_ring_write(ring, 1 << vm->id); |
| 1594 | |||
| 1595 | /* sync PFP to ME, otherwise we might get invalid PFP reads */ | ||
| 1596 | radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0)); | ||
| 1597 | radeon_ring_write(ring, 0x0); | ||
| 1589 | } | 1598 | } |
diff --git a/drivers/gpu/drm/radeon/nid.h b/drivers/gpu/drm/radeon/nid.h index 2423d1b5d385..cbef6815907a 100644 --- a/drivers/gpu/drm/radeon/nid.h +++ b/drivers/gpu/drm/radeon/nid.h | |||
| @@ -502,6 +502,7 @@ | |||
| 502 | #define PACKET3_MPEG_INDEX 0x3A | 502 | #define PACKET3_MPEG_INDEX 0x3A |
| 503 | #define PACKET3_WAIT_REG_MEM 0x3C | 503 | #define PACKET3_WAIT_REG_MEM 0x3C |
| 504 | #define PACKET3_MEM_WRITE 0x3D | 504 | #define PACKET3_MEM_WRITE 0x3D |
| 505 | #define PACKET3_PFP_SYNC_ME 0x42 | ||
| 505 | #define PACKET3_SURFACE_SYNC 0x43 | 506 | #define PACKET3_SURFACE_SYNC 0x43 |
| 506 | # define PACKET3_CB0_DEST_BASE_ENA (1 << 6) | 507 | # define PACKET3_CB0_DEST_BASE_ENA (1 << 6) |
| 507 | # define PACKET3_CB1_DEST_BASE_ENA (1 << 7) | 508 | # define PACKET3_CB1_DEST_BASE_ENA (1 << 7) |
diff --git a/drivers/gpu/drm/radeon/radeon_atpx_handler.c b/drivers/gpu/drm/radeon/radeon_atpx_handler.c index 1aa3f910b993..37f6a907aea4 100644 --- a/drivers/gpu/drm/radeon/radeon_atpx_handler.c +++ b/drivers/gpu/drm/radeon/radeon_atpx_handler.c | |||
| @@ -87,7 +87,7 @@ static union acpi_object *radeon_atpx_call(acpi_handle handle, int function, | |||
| 87 | atpx_arg_elements[1].integer.value = 0; | 87 | atpx_arg_elements[1].integer.value = 0; |
| 88 | } | 88 | } |
| 89 | 89 | ||
| 90 | status = acpi_evaluate_object(handle, "ATPX", &atpx_arg, &buffer); | 90 | status = acpi_evaluate_object(handle, NULL, &atpx_arg, &buffer); |
| 91 | 91 | ||
| 92 | /* Fail only if calling the method fails and ATPX is supported */ | 92 | /* Fail only if calling the method fails and ATPX is supported */ |
| 93 | if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) { | 93 | if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) { |
| @@ -373,11 +373,11 @@ static int radeon_atpx_power_state(enum vga_switcheroo_client_id id, | |||
| 373 | } | 373 | } |
| 374 | 374 | ||
| 375 | /** | 375 | /** |
| 376 | * radeon_atpx_pci_probe_handle - look up the ATRM and ATPX handles | 376 | * radeon_atpx_pci_probe_handle - look up the ATPX handle |
| 377 | * | 377 | * |
| 378 | * @pdev: pci device | 378 | * @pdev: pci device |
| 379 | * | 379 | * |
| 380 | * Look up the ATPX and ATRM handles (all asics). | 380 | * Look up the ATPX handles (all asics). |
| 381 | * Returns true if the handles are found, false if not. | 381 | * Returns true if the handles are found, false if not. |
| 382 | */ | 382 | */ |
| 383 | static bool radeon_atpx_pci_probe_handle(struct pci_dev *pdev) | 383 | static bool radeon_atpx_pci_probe_handle(struct pci_dev *pdev) |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index bd13ca09eb62..e2f5f888c374 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
| @@ -355,6 +355,8 @@ int radeon_wb_init(struct radeon_device *rdev) | |||
| 355 | */ | 355 | */ |
| 356 | void radeon_vram_location(struct radeon_device *rdev, struct radeon_mc *mc, u64 base) | 356 | void radeon_vram_location(struct radeon_device *rdev, struct radeon_mc *mc, u64 base) |
| 357 | { | 357 | { |
| 358 | uint64_t limit = (uint64_t)radeon_vram_limit << 20; | ||
| 359 | |||
| 358 | mc->vram_start = base; | 360 | mc->vram_start = base; |
| 359 | if (mc->mc_vram_size > (0xFFFFFFFF - base + 1)) { | 361 | if (mc->mc_vram_size > (0xFFFFFFFF - base + 1)) { |
| 360 | dev_warn(rdev->dev, "limiting VRAM to PCI aperture size\n"); | 362 | dev_warn(rdev->dev, "limiting VRAM to PCI aperture size\n"); |
| @@ -368,8 +370,8 @@ void radeon_vram_location(struct radeon_device *rdev, struct radeon_mc *mc, u64 | |||
| 368 | mc->mc_vram_size = mc->aper_size; | 370 | mc->mc_vram_size = mc->aper_size; |
| 369 | } | 371 | } |
| 370 | mc->vram_end = mc->vram_start + mc->mc_vram_size - 1; | 372 | mc->vram_end = mc->vram_start + mc->mc_vram_size - 1; |
| 371 | if (radeon_vram_limit && radeon_vram_limit < mc->real_vram_size) | 373 | if (limit && limit < mc->real_vram_size) |
| 372 | mc->real_vram_size = radeon_vram_limit; | 374 | mc->real_vram_size = limit; |
| 373 | dev_info(rdev->dev, "VRAM: %lluM 0x%016llX - 0x%016llX (%lluM used)\n", | 375 | dev_info(rdev->dev, "VRAM: %lluM 0x%016llX - 0x%016llX (%lluM used)\n", |
| 374 | mc->mc_vram_size >> 20, mc->vram_start, | 376 | mc->mc_vram_size >> 20, mc->vram_start, |
| 375 | mc->vram_end, mc->real_vram_size >> 20); | 377 | mc->vram_end, mc->real_vram_size >> 20); |
| @@ -835,6 +837,19 @@ static unsigned int radeon_vga_set_decode(void *cookie, bool state) | |||
| 835 | } | 837 | } |
| 836 | 838 | ||
| 837 | /** | 839 | /** |
| 840 | * radeon_check_pot_argument - check that argument is a power of two | ||
| 841 | * | ||
| 842 | * @arg: value to check | ||
| 843 | * | ||
| 844 | * Validates that a certain argument is a power of two (all asics). | ||
| 845 | * Returns true if argument is valid. | ||
| 846 | */ | ||
| 847 | static bool radeon_check_pot_argument(int arg) | ||
| 848 | { | ||
| 849 | return (arg & (arg - 1)) == 0; | ||
| 850 | } | ||
| 851 | |||
| 852 | /** | ||
| 838 | * radeon_check_arguments - validate module params | 853 | * radeon_check_arguments - validate module params |
| 839 | * | 854 | * |
| 840 | * @rdev: radeon_device pointer | 855 | * @rdev: radeon_device pointer |
| @@ -845,52 +860,25 @@ static unsigned int radeon_vga_set_decode(void *cookie, bool state) | |||
| 845 | static void radeon_check_arguments(struct radeon_device *rdev) | 860 | static void radeon_check_arguments(struct radeon_device *rdev) |
| 846 | { | 861 | { |
| 847 | /* vramlimit must be a power of two */ | 862 | /* vramlimit must be a power of two */ |
| 848 | switch (radeon_vram_limit) { | 863 | if (!radeon_check_pot_argument(radeon_vram_limit)) { |
| 849 | case 0: | ||
| 850 | case 4: | ||
| 851 | case 8: | ||
| 852 | case 16: | ||
| 853 | case 32: | ||
| 854 | case 64: | ||
| 855 | case 128: | ||
| 856 | case 256: | ||
| 857 | case 512: | ||
| 858 | case 1024: | ||
| 859 | case 2048: | ||
| 860 | case 4096: | ||
| 861 | break; | ||
| 862 | default: | ||
| 863 | dev_warn(rdev->dev, "vram limit (%d) must be a power of 2\n", | 864 | dev_warn(rdev->dev, "vram limit (%d) must be a power of 2\n", |
| 864 | radeon_vram_limit); | 865 | radeon_vram_limit); |
| 865 | radeon_vram_limit = 0; | 866 | radeon_vram_limit = 0; |
| 866 | break; | ||
| 867 | } | 867 | } |
| 868 | radeon_vram_limit = radeon_vram_limit << 20; | 868 | |
| 869 | /* gtt size must be power of two and greater or equal to 32M */ | 869 | /* gtt size must be power of two and greater or equal to 32M */ |
| 870 | switch (radeon_gart_size) { | 870 | if (radeon_gart_size < 32) { |
| 871 | case 4: | ||
| 872 | case 8: | ||
| 873 | case 16: | ||
| 874 | dev_warn(rdev->dev, "gart size (%d) too small forcing to 512M\n", | 871 | dev_warn(rdev->dev, "gart size (%d) too small forcing to 512M\n", |
| 875 | radeon_gart_size); | 872 | radeon_gart_size); |
| 876 | radeon_gart_size = 512; | 873 | radeon_gart_size = 512; |
| 877 | break; | 874 | |
| 878 | case 32: | 875 | } else if (!radeon_check_pot_argument(radeon_gart_size)) { |
| 879 | case 64: | ||
| 880 | case 128: | ||
| 881 | case 256: | ||
| 882 | case 512: | ||
| 883 | case 1024: | ||
| 884 | case 2048: | ||
| 885 | case 4096: | ||
| 886 | break; | ||
| 887 | default: | ||
| 888 | dev_warn(rdev->dev, "gart size (%d) must be a power of 2\n", | 876 | dev_warn(rdev->dev, "gart size (%d) must be a power of 2\n", |
| 889 | radeon_gart_size); | 877 | radeon_gart_size); |
| 890 | radeon_gart_size = 512; | 878 | radeon_gart_size = 512; |
| 891 | break; | ||
| 892 | } | 879 | } |
| 893 | rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024; | 880 | rdev->mc.gtt_size = (uint64_t)radeon_gart_size << 20; |
| 881 | |||
| 894 | /* AGP mode can only be -1, 1, 2, 4, 8 */ | 882 | /* AGP mode can only be -1, 1, 2, 4, 8 */ |
| 895 | switch (radeon_agpmode) { | 883 | switch (radeon_agpmode) { |
| 896 | case -1: | 884 | case -1: |
diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c index a7677dd1ce98..4debd60e5aa6 100644 --- a/drivers/gpu/drm/radeon/radeon_gart.c +++ b/drivers/gpu/drm/radeon/radeon_gart.c | |||
| @@ -355,14 +355,13 @@ int radeon_gart_init(struct radeon_device *rdev) | |||
| 355 | DRM_INFO("GART: num cpu pages %u, num gpu pages %u\n", | 355 | DRM_INFO("GART: num cpu pages %u, num gpu pages %u\n", |
| 356 | rdev->gart.num_cpu_pages, rdev->gart.num_gpu_pages); | 356 | rdev->gart.num_cpu_pages, rdev->gart.num_gpu_pages); |
| 357 | /* Allocate pages table */ | 357 | /* Allocate pages table */ |
| 358 | rdev->gart.pages = kzalloc(sizeof(void *) * rdev->gart.num_cpu_pages, | 358 | rdev->gart.pages = vzalloc(sizeof(void *) * rdev->gart.num_cpu_pages); |
| 359 | GFP_KERNEL); | ||
| 360 | if (rdev->gart.pages == NULL) { | 359 | if (rdev->gart.pages == NULL) { |
| 361 | radeon_gart_fini(rdev); | 360 | radeon_gart_fini(rdev); |
| 362 | return -ENOMEM; | 361 | return -ENOMEM; |
| 363 | } | 362 | } |
| 364 | rdev->gart.pages_addr = kzalloc(sizeof(dma_addr_t) * | 363 | rdev->gart.pages_addr = vzalloc(sizeof(dma_addr_t) * |
| 365 | rdev->gart.num_cpu_pages, GFP_KERNEL); | 364 | rdev->gart.num_cpu_pages); |
| 366 | if (rdev->gart.pages_addr == NULL) { | 365 | if (rdev->gart.pages_addr == NULL) { |
| 367 | radeon_gart_fini(rdev); | 366 | radeon_gart_fini(rdev); |
| 368 | return -ENOMEM; | 367 | return -ENOMEM; |
| @@ -388,8 +387,8 @@ void radeon_gart_fini(struct radeon_device *rdev) | |||
| 388 | radeon_gart_unbind(rdev, 0, rdev->gart.num_cpu_pages); | 387 | radeon_gart_unbind(rdev, 0, rdev->gart.num_cpu_pages); |
| 389 | } | 388 | } |
| 390 | rdev->gart.ready = false; | 389 | rdev->gart.ready = false; |
| 391 | kfree(rdev->gart.pages); | 390 | vfree(rdev->gart.pages); |
| 392 | kfree(rdev->gart.pages_addr); | 391 | vfree(rdev->gart.pages_addr); |
| 393 | rdev->gart.pages = NULL; | 392 | rdev->gart.pages = NULL; |
| 394 | rdev->gart.pages_addr = NULL; | 393 | rdev->gart.pages_addr = NULL; |
| 395 | 394 | ||
| @@ -577,7 +576,7 @@ void radeon_vm_manager_fini(struct radeon_device *rdev) | |||
| 577 | * | 576 | * |
| 578 | * Global and local mutex must be locked! | 577 | * Global and local mutex must be locked! |
| 579 | */ | 578 | */ |
| 580 | int radeon_vm_evict(struct radeon_device *rdev, struct radeon_vm *vm) | 579 | static int radeon_vm_evict(struct radeon_device *rdev, struct radeon_vm *vm) |
| 581 | { | 580 | { |
| 582 | struct radeon_vm *vm_evict; | 581 | struct radeon_vm *vm_evict; |
| 583 | 582 | ||
| @@ -1036,8 +1035,7 @@ static void radeon_vm_update_ptes(struct radeon_device *rdev, | |||
| 1036 | pte = radeon_sa_bo_gpu_addr(vm->page_tables[pt_idx]); | 1035 | pte = radeon_sa_bo_gpu_addr(vm->page_tables[pt_idx]); |
| 1037 | pte += (addr & mask) * 8; | 1036 | pte += (addr & mask) * 8; |
| 1038 | 1037 | ||
| 1039 | if (((last_pte + 8 * count) != pte) || | 1038 | if ((last_pte + 8 * count) != pte) { |
| 1040 | ((count + nptes) > 1 << 11)) { | ||
| 1041 | 1039 | ||
| 1042 | if (count) { | 1040 | if (count) { |
| 1043 | radeon_asic_vm_set_page(rdev, last_pte, | 1041 | radeon_asic_vm_set_page(rdev, last_pte, |
| @@ -1148,17 +1146,17 @@ int radeon_vm_bo_update_pte(struct radeon_device *rdev, | |||
| 1148 | 1146 | ||
| 1149 | if (RADEON_VM_BLOCK_SIZE > 11) | 1147 | if (RADEON_VM_BLOCK_SIZE > 11) |
| 1150 | /* reserve space for one header for every 2k dwords */ | 1148 | /* reserve space for one header for every 2k dwords */ |
| 1151 | ndw += (nptes >> 11) * 3; | 1149 | ndw += (nptes >> 11) * 4; |
| 1152 | else | 1150 | else |
| 1153 | /* reserve space for one header for | 1151 | /* reserve space for one header for |
| 1154 | every (1 << BLOCK_SIZE) entries */ | 1152 | every (1 << BLOCK_SIZE) entries */ |
| 1155 | ndw += (nptes >> RADEON_VM_BLOCK_SIZE) * 3; | 1153 | ndw += (nptes >> RADEON_VM_BLOCK_SIZE) * 4; |
| 1156 | 1154 | ||
| 1157 | /* reserve space for pte addresses */ | 1155 | /* reserve space for pte addresses */ |
| 1158 | ndw += nptes * 2; | 1156 | ndw += nptes * 2; |
| 1159 | 1157 | ||
| 1160 | /* reserve space for one header for every 2k dwords */ | 1158 | /* reserve space for one header for every 2k dwords */ |
| 1161 | ndw += (npdes >> 11) * 3; | 1159 | ndw += (npdes >> 11) * 4; |
| 1162 | 1160 | ||
| 1163 | /* reserve space for pde addresses */ | 1161 | /* reserve space for pde addresses */ |
| 1164 | ndw += npdes * 2; | 1162 | ndw += npdes * 2; |
diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c index f38fbcc46935..fe5c1f6b7957 100644 --- a/drivers/gpu/drm/radeon/radeon_gem.c +++ b/drivers/gpu/drm/radeon/radeon_gem.c | |||
| @@ -53,6 +53,7 @@ int radeon_gem_object_create(struct radeon_device *rdev, int size, | |||
| 53 | struct drm_gem_object **obj) | 53 | struct drm_gem_object **obj) |
| 54 | { | 54 | { |
| 55 | struct radeon_bo *robj; | 55 | struct radeon_bo *robj; |
| 56 | unsigned long max_size; | ||
| 56 | int r; | 57 | int r; |
| 57 | 58 | ||
| 58 | *obj = NULL; | 59 | *obj = NULL; |
| @@ -60,11 +61,26 @@ int radeon_gem_object_create(struct radeon_device *rdev, int size, | |||
| 60 | if (alignment < PAGE_SIZE) { | 61 | if (alignment < PAGE_SIZE) { |
| 61 | alignment = PAGE_SIZE; | 62 | alignment = PAGE_SIZE; |
| 62 | } | 63 | } |
| 64 | |||
| 65 | /* maximun bo size is the minimun btw visible vram and gtt size */ | ||
| 66 | max_size = min(rdev->mc.visible_vram_size, rdev->mc.gtt_size); | ||
| 67 | if (size > max_size) { | ||
| 68 | printk(KERN_WARNING "%s:%d alloc size %dMb bigger than %ldMb limit\n", | ||
| 69 | __func__, __LINE__, size >> 20, max_size >> 20); | ||
| 70 | return -ENOMEM; | ||
| 71 | } | ||
| 72 | |||
| 73 | retry: | ||
| 63 | r = radeon_bo_create(rdev, size, alignment, kernel, initial_domain, NULL, &robj); | 74 | r = radeon_bo_create(rdev, size, alignment, kernel, initial_domain, NULL, &robj); |
| 64 | if (r) { | 75 | if (r) { |
| 65 | if (r != -ERESTARTSYS) | 76 | if (r != -ERESTARTSYS) { |
| 77 | if (initial_domain == RADEON_GEM_DOMAIN_VRAM) { | ||
| 78 | initial_domain |= RADEON_GEM_DOMAIN_GTT; | ||
| 79 | goto retry; | ||
| 80 | } | ||
| 66 | DRM_ERROR("Failed to allocate GEM object (%d, %d, %u, %d)\n", | 81 | DRM_ERROR("Failed to allocate GEM object (%d, %d, %u, %d)\n", |
| 67 | size, initial_domain, alignment, r); | 82 | size, initial_domain, alignment, r); |
| 83 | } | ||
| 68 | return r; | 84 | return r; |
| 69 | } | 85 | } |
| 70 | *obj = &robj->gem_base; | 86 | *obj = &robj->gem_base; |
diff --git a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c index a13ad9d707cf..0063df9d166d 100644 --- a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c | |||
| @@ -370,6 +370,7 @@ void radeon_legacy_backlight_init(struct radeon_encoder *radeon_encoder, | |||
| 370 | struct backlight_properties props; | 370 | struct backlight_properties props; |
| 371 | struct radeon_backlight_privdata *pdata; | 371 | struct radeon_backlight_privdata *pdata; |
| 372 | uint8_t backlight_level; | 372 | uint8_t backlight_level; |
| 373 | char bl_name[16]; | ||
| 373 | 374 | ||
| 374 | if (!radeon_encoder->enc_priv) | 375 | if (!radeon_encoder->enc_priv) |
| 375 | return; | 376 | return; |
| @@ -389,7 +390,9 @@ void radeon_legacy_backlight_init(struct radeon_encoder *radeon_encoder, | |||
| 389 | memset(&props, 0, sizeof(props)); | 390 | memset(&props, 0, sizeof(props)); |
| 390 | props.max_brightness = RADEON_MAX_BL_LEVEL; | 391 | props.max_brightness = RADEON_MAX_BL_LEVEL; |
| 391 | props.type = BACKLIGHT_RAW; | 392 | props.type = BACKLIGHT_RAW; |
| 392 | bd = backlight_device_register("radeon_bl", &drm_connector->kdev, | 393 | snprintf(bl_name, sizeof(bl_name), |
| 394 | "radeon_bl%d", dev->primary->index); | ||
| 395 | bd = backlight_device_register(bl_name, &drm_connector->kdev, | ||
| 393 | pdata, &radeon_backlight_ops, &props); | 396 | pdata, &radeon_backlight_ops, &props); |
| 394 | if (IS_ERR(bd)) { | 397 | if (IS_ERR(bd)) { |
| 395 | DRM_ERROR("Backlight registration failed\n"); | 398 | DRM_ERROR("Backlight registration failed\n"); |
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c index 8b27dd6e3144..b91118ccef86 100644 --- a/drivers/gpu/drm/radeon/radeon_object.c +++ b/drivers/gpu/drm/radeon/radeon_object.c | |||
| @@ -105,7 +105,6 @@ int radeon_bo_create(struct radeon_device *rdev, | |||
| 105 | struct radeon_bo *bo; | 105 | struct radeon_bo *bo; |
| 106 | enum ttm_bo_type type; | 106 | enum ttm_bo_type type; |
| 107 | unsigned long page_align = roundup(byte_align, PAGE_SIZE) >> PAGE_SHIFT; | 107 | unsigned long page_align = roundup(byte_align, PAGE_SIZE) >> PAGE_SHIFT; |
| 108 | unsigned long max_size = 0; | ||
| 109 | size_t acc_size; | 108 | size_t acc_size; |
| 110 | int r; | 109 | int r; |
| 111 | 110 | ||
| @@ -121,18 +120,9 @@ int radeon_bo_create(struct radeon_device *rdev, | |||
| 121 | } | 120 | } |
| 122 | *bo_ptr = NULL; | 121 | *bo_ptr = NULL; |
| 123 | 122 | ||
| 124 | /* maximun bo size is the minimun btw visible vram and gtt size */ | ||
| 125 | max_size = min(rdev->mc.visible_vram_size, rdev->mc.gtt_size); | ||
| 126 | if ((page_align << PAGE_SHIFT) >= max_size) { | ||
| 127 | printk(KERN_WARNING "%s:%d alloc size %ldM bigger than %ldMb limit\n", | ||
| 128 | __func__, __LINE__, page_align >> (20 - PAGE_SHIFT), max_size >> 20); | ||
| 129 | return -ENOMEM; | ||
| 130 | } | ||
| 131 | |||
| 132 | acc_size = ttm_bo_dma_acc_size(&rdev->mman.bdev, size, | 123 | acc_size = ttm_bo_dma_acc_size(&rdev->mman.bdev, size, |
| 133 | sizeof(struct radeon_bo)); | 124 | sizeof(struct radeon_bo)); |
| 134 | 125 | ||
| 135 | retry: | ||
| 136 | bo = kzalloc(sizeof(struct radeon_bo), GFP_KERNEL); | 126 | bo = kzalloc(sizeof(struct radeon_bo), GFP_KERNEL); |
| 137 | if (bo == NULL) | 127 | if (bo == NULL) |
| 138 | return -ENOMEM; | 128 | return -ENOMEM; |
| @@ -154,15 +144,6 @@ retry: | |||
| 154 | acc_size, sg, &radeon_ttm_bo_destroy); | 144 | acc_size, sg, &radeon_ttm_bo_destroy); |
| 155 | up_read(&rdev->pm.mclk_lock); | 145 | up_read(&rdev->pm.mclk_lock); |
| 156 | if (unlikely(r != 0)) { | 146 | if (unlikely(r != 0)) { |
| 157 | if (r != -ERESTARTSYS) { | ||
| 158 | if (domain == RADEON_GEM_DOMAIN_VRAM) { | ||
| 159 | domain |= RADEON_GEM_DOMAIN_GTT; | ||
| 160 | goto retry; | ||
| 161 | } | ||
| 162 | dev_err(rdev->dev, | ||
| 163 | "object_init failed for (%lu, 0x%08X)\n", | ||
| 164 | size, domain); | ||
| 165 | } | ||
| 166 | return r; | 147 | return r; |
| 167 | } | 148 | } |
| 168 | *bo_ptr = bo; | 149 | *bo_ptr = bo; |
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c index df8dd7701643..b0db712060fb 100644 --- a/drivers/gpu/drm/radeon/si.c +++ b/drivers/gpu/drm/radeon/si.c | |||
| @@ -2808,26 +2808,31 @@ void si_vm_set_page(struct radeon_device *rdev, uint64_t pe, | |||
| 2808 | { | 2808 | { |
| 2809 | struct radeon_ring *ring = &rdev->ring[rdev->asic->vm.pt_ring_index]; | 2809 | struct radeon_ring *ring = &rdev->ring[rdev->asic->vm.pt_ring_index]; |
| 2810 | uint32_t r600_flags = cayman_vm_page_flags(rdev, flags); | 2810 | uint32_t r600_flags = cayman_vm_page_flags(rdev, flags); |
| 2811 | int i; | ||
| 2812 | uint64_t value; | ||
| 2813 | 2811 | ||
| 2814 | radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 2 + count * 2)); | 2812 | while (count) { |
| 2815 | radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) | | 2813 | unsigned ndw = 2 + count * 2; |
| 2816 | WRITE_DATA_DST_SEL(1))); | 2814 | if (ndw > 0x3FFE) |
| 2817 | radeon_ring_write(ring, pe); | 2815 | ndw = 0x3FFE; |
| 2818 | radeon_ring_write(ring, upper_32_bits(pe)); | 2816 | |
| 2819 | for (i = 0; i < count; ++i) { | 2817 | radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, ndw)); |
| 2820 | if (flags & RADEON_VM_PAGE_SYSTEM) { | 2818 | radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) | |
| 2821 | value = radeon_vm_map_gart(rdev, addr); | 2819 | WRITE_DATA_DST_SEL(1))); |
| 2822 | value &= 0xFFFFFFFFFFFFF000ULL; | 2820 | radeon_ring_write(ring, pe); |
| 2823 | } else if (flags & RADEON_VM_PAGE_VALID) | 2821 | radeon_ring_write(ring, upper_32_bits(pe)); |
| 2824 | value = addr; | 2822 | for (; ndw > 2; ndw -= 2, --count, pe += 8) { |
| 2825 | else | 2823 | uint64_t value; |
| 2826 | value = 0; | 2824 | if (flags & RADEON_VM_PAGE_SYSTEM) { |
| 2827 | addr += incr; | 2825 | value = radeon_vm_map_gart(rdev, addr); |
| 2828 | value |= r600_flags; | 2826 | value &= 0xFFFFFFFFFFFFF000ULL; |
| 2829 | radeon_ring_write(ring, value); | 2827 | } else if (flags & RADEON_VM_PAGE_VALID) |
| 2830 | radeon_ring_write(ring, upper_32_bits(value)); | 2828 | value = addr; |
| 2829 | else | ||
| 2830 | value = 0; | ||
| 2831 | addr += incr; | ||
| 2832 | value |= r600_flags; | ||
| 2833 | radeon_ring_write(ring, value); | ||
| 2834 | radeon_ring_write(ring, upper_32_bits(value)); | ||
| 2835 | } | ||
| 2831 | } | 2836 | } |
| 2832 | } | 2837 | } |
| 2833 | 2838 | ||
| @@ -2868,6 +2873,10 @@ void si_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm) | |||
| 2868 | radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2); | 2873 | radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2); |
| 2869 | radeon_ring_write(ring, 0); | 2874 | radeon_ring_write(ring, 0); |
| 2870 | radeon_ring_write(ring, 1 << vm->id); | 2875 | radeon_ring_write(ring, 1 << vm->id); |
| 2876 | |||
| 2877 | /* sync PFP to ME, otherwise we might get invalid PFP reads */ | ||
| 2878 | radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0)); | ||
| 2879 | radeon_ring_write(ring, 0x0); | ||
| 2871 | } | 2880 | } |
| 2872 | 2881 | ||
| 2873 | /* | 2882 | /* |
diff --git a/include/drm/drm_pciids.h b/include/drm/drm_pciids.h index c78bb997e2c6..af1cbaf535ed 100644 --- a/include/drm/drm_pciids.h +++ b/include/drm/drm_pciids.h | |||
| @@ -205,6 +205,8 @@ | |||
| 205 | {0x1002, 0x6788, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ | 205 | {0x1002, 0x6788, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ |
| 206 | {0x1002, 0x678A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ | 206 | {0x1002, 0x678A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ |
| 207 | {0x1002, 0x6790, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ | 207 | {0x1002, 0x6790, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ |
| 208 | {0x1002, 0x6791, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ | ||
| 209 | {0x1002, 0x6792, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ | ||
| 208 | {0x1002, 0x6798, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ | 210 | {0x1002, 0x6798, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ |
| 209 | {0x1002, 0x6799, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ | 211 | {0x1002, 0x6799, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ |
| 210 | {0x1002, 0x679A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ | 212 | {0x1002, 0x679A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ |
| @@ -217,6 +219,7 @@ | |||
| 217 | {0x1002, 0x6808, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \ | 219 | {0x1002, 0x6808, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \ |
| 218 | {0x1002, 0x6809, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \ | 220 | {0x1002, 0x6809, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \ |
| 219 | {0x1002, 0x6810, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \ | 221 | {0x1002, 0x6810, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \ |
| 222 | {0x1002, 0x6811, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \ | ||
| 220 | {0x1002, 0x6816, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \ | 223 | {0x1002, 0x6816, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \ |
| 221 | {0x1002, 0x6817, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \ | 224 | {0x1002, 0x6817, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \ |
| 222 | {0x1002, 0x6818, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \ | 225 | {0x1002, 0x6818, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \ |
