Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'drm-linus' into drm-core-next

+1065 -66
+3 -2
drivers/gpu/drm/nouveau/Kconfig
··· 30 30 via debugfs. 31 31 32 32 menu "I2C encoder or helper chips" 33 - depends on DRM 33 + depends on DRM && I2C 34 34 35 35 config DRM_I2C_CH7006 36 36 tristate "Chrontel ch7006 TV encoder" 37 - default m if DRM_NOUVEAU 37 + depends on DRM_NOUVEAU 38 + default m 38 39 help 39 40 Support for Chrontel ch7006 and similar TV encoders, found 40 41 on some nVidia video cards.
+2
drivers/gpu/drm/nouveau/nouveau_bo.c
··· 311 311 struct drm_device *dev = dev_priv->dev; 312 312 313 313 switch (dev_priv->gart_info.type) { 314 + #if __OS_HAS_AGP 314 315 case NOUVEAU_GART_AGP: 315 316 return ttm_agp_backend_init(bdev, dev->agp->bridge); 317 + #endif 316 318 case NOUVEAU_GART_SGDMA: 317 319 return nouveau_sgdma_init_ttm(dev); 318 320 default:
+1 -1
drivers/gpu/drm/nouveau/nouveau_fence.c
··· 205 205 schedule_timeout(1); 206 206 207 207 if (intr && signal_pending(current)) { 208 - ret = -ERESTART; 208 + ret = -ERESTARTSYS; 209 209 break; 210 210 } 211 211 }
-7
drivers/gpu/drm/nouveau/nouveau_gem.c
··· 342 342 } 343 343 344 344 ret = ttm_bo_wait_cpu(&nvbo->bo, false); 345 - if (ret == -ERESTART) 346 - ret = -EAGAIN; 347 345 if (ret) 348 346 return ret; 349 347 goto retry; ··· 913 915 goto out; 914 916 915 917 ret = ttm_bo_wait_cpu(&nvbo->bo, no_wait); 916 - if (ret == -ERESTART) 917 - ret = -EAGAIN; 918 918 if (ret) 919 919 goto out; 920 920 } ··· 921 925 ret = ttm_bo_wait(&nvbo->bo, false, false, no_wait); 922 926 } else { 923 927 ret = ttm_bo_synccpu_write_grab(&nvbo->bo, no_wait); 924 - if (ret == -ERESTART) 925 - ret = -EAGAIN; 926 - else 927 928 if (ret == 0) 928 929 nvbo->cpu_filp = file_priv; 929 930 }
+4
drivers/gpu/drm/nouveau/nouveau_mem.c
··· 407 407 return 0; 408 408 } 409 409 410 + #if __OS_HAS_AGP 410 411 static void nouveau_mem_reset_agp(struct drm_device *dev) 411 412 { 412 413 uint32_t saved_pci_nv_1, saved_pci_nv_19, pmc_enable; ··· 433 432 nv_wr32(dev, NV04_PBUS_PCI_NV_19, saved_pci_nv_19); 434 433 nv_wr32(dev, NV04_PBUS_PCI_NV_1, saved_pci_nv_1); 435 434 } 435 + #endif 436 436 437 437 int 438 438 nouveau_mem_init_agp(struct drm_device *dev) 439 439 { 440 + #if __OS_HAS_AGP 440 441 struct drm_nouveau_private *dev_priv = dev->dev_private; 441 442 struct drm_agp_info info; 442 443 struct drm_agp_mode mode; ··· 474 471 dev_priv->gart_info.type = NOUVEAU_GART_AGP; 475 472 dev_priv->gart_info.aper_base = info.aperture_base; 476 473 dev_priv->gart_info.aper_size = info.aperture_size; 474 + #endif 477 475 return 0; 478 476 } 479 477
+12 -8
drivers/gpu/drm/nouveau/nv40_graph.c
··· 252 252 memcpy(pgraph->ctxprog, fw->data, fw->size); 253 253 254 254 cp = pgraph->ctxprog; 255 - if (cp->signature != 0x5043564e || cp->version != 0 || 256 - cp->length != ((fw->size - 7) / 4)) { 255 + if (le32_to_cpu(cp->signature) != 0x5043564e || 256 + cp->version != 0 || 257 + le16_to_cpu(cp->length) != ((fw->size - 7) / 4)) { 257 258 NV_ERROR(dev, "ctxprog invalid\n"); 258 259 release_firmware(fw); 259 260 nv40_grctx_fini(dev); ··· 282 281 memcpy(pgraph->ctxvals, fw->data, fw->size); 283 282 284 283 cv = (void *)pgraph->ctxvals; 285 - if (cv->signature != 0x5643564e || cv->version != 0 || 286 - cv->length != ((fw->size - 9) / 8)) { 284 + if (le32_to_cpu(cv->signature) != 0x5643564e || 285 + cv->version != 0 || 286 + le32_to_cpu(cv->length) != ((fw->size - 9) / 8)) { 287 287 NV_ERROR(dev, "ctxvals invalid\n"); 288 288 release_firmware(fw); 289 289 nv40_grctx_fini(dev); ··· 296 294 cp = pgraph->ctxprog; 297 295 298 296 nv_wr32(dev, NV40_PGRAPH_CTXCTL_UCODE_INDEX, 0); 299 - for (i = 0; i < cp->length; i++) 300 - nv_wr32(dev, NV40_PGRAPH_CTXCTL_UCODE_DATA, cp->data[i]); 297 + for (i = 0; i < le16_to_cpu(cp->length); i++) 298 + nv_wr32(dev, NV40_PGRAPH_CTXCTL_UCODE_DATA, 299 + le32_to_cpu(cp->data[i])); 301 300 302 301 pgraph->accel_blocked = false; 303 302 return 0; ··· 332 329 if (!cv) 333 330 return; 334 331 335 - for (i = 0; i < cv->length; i++) 336 - nv_wo32(dev, ctx, cv->data[i].offset, cv->data[i].value); 332 + for (i = 0; i < le32_to_cpu(cv->length); i++) 333 + nv_wo32(dev, ctx, le32_to_cpu(cv->data[i].offset), 334 + le32_to_cpu(cv->data[i].value)); 337 335 } 338 336 339 337 /*
+1 -1
drivers/gpu/drm/radeon/Makefile
··· 49 49 radeon_cs.o radeon_bios.o radeon_benchmark.o r100.o r300.o r420.o \ 50 50 rs400.o rs600.o rs690.o rv515.o r520.o r600.o rv770.o radeon_test.o \ 51 51 r200.o radeon_legacy_tv.o r600_cs.o r600_blit.o r600_blit_shaders.o \ 52 - r600_blit_kms.o radeon_pm.o atombios_dp.o 52 + r600_blit_kms.o radeon_pm.o atombios_dp.o r600_audio.o r600_hdmi.o 53 53 54 54 radeon-$(CONFIG_COMPAT) += radeon_ioc32.o 55 55
+50 -4
drivers/gpu/drm/radeon/r100.c
··· 1374 1374 case RADEON_TXFORMAT_ARGB4444: 1375 1375 case RADEON_TXFORMAT_VYUY422: 1376 1376 case RADEON_TXFORMAT_YVYU422: 1377 - case RADEON_TXFORMAT_DXT1: 1378 1377 case RADEON_TXFORMAT_SHADOW16: 1379 1378 case RADEON_TXFORMAT_LDUDV655: 1380 1379 case RADEON_TXFORMAT_DUDV88: ··· 1381 1382 break; 1382 1383 case RADEON_TXFORMAT_ARGB8888: 1383 1384 case RADEON_TXFORMAT_RGBA8888: 1384 - case RADEON_TXFORMAT_DXT23: 1385 - case RADEON_TXFORMAT_DXT45: 1386 1385 case RADEON_TXFORMAT_SHADOW32: 1387 1386 case RADEON_TXFORMAT_LDUDUV8888: 1388 1387 track->textures[i].cpp = 4; 1388 + break; 1389 + case RADEON_TXFORMAT_DXT1: 1390 + track->textures[i].cpp = 1; 1391 + track->textures[i].compress_format = R100_TRACK_COMP_DXT1; 1392 + break; 1393 + case RADEON_TXFORMAT_DXT23: 1394 + case RADEON_TXFORMAT_DXT45: 1395 + track->textures[i].cpp = 1; 1396 + track->textures[i].compress_format = R100_TRACK_COMP_DXT35; 1389 1397 break; 1390 1398 } 1391 1399 track->textures[i].cube_info[4].width = 1 << ((idx_value >> 16) & 0xf); ··· 2737 2731 DRM_ERROR("coordinate type %d\n", t->tex_coord_type); 2738 2732 DRM_ERROR("width round to power of 2 %d\n", t->roundup_w); 2739 2733 DRM_ERROR("height round to power of 2 %d\n", t->roundup_h); 2734 + DRM_ERROR("compress format %d\n", t->compress_format); 2740 2735 } 2741 2736 2742 2737 static int r100_cs_track_cube(struct radeon_device *rdev, ··· 2765 2758 } 2766 2759 } 2767 2760 return 0; 2761 + } 2762 + 2763 + static int r100_track_compress_size(int compress_format, int w, int h) 2764 + { 2765 + int block_width, block_height, block_bytes; 2766 + int wblocks, hblocks; 2767 + int min_wblocks; 2768 + int sz; 2769 + 2770 + block_width = 4; 2771 + block_height = 4; 2772 + 2773 + switch (compress_format) { 2774 + case R100_TRACK_COMP_DXT1: 2775 + block_bytes = 8; 2776 + min_wblocks = 4; 2777 + break; 2778 + default: 2779 + case R100_TRACK_COMP_DXT35: 2780 + block_bytes = 16; 2781 + min_wblocks = 2; 2782 + break; 2783 + } 2784 + 2785 + hblocks = (h + block_height - 1) / block_height; 2786 + wblocks = (w + block_width - 1) / block_width; 2787 + if (wblocks < min_wblocks) 2788 + wblocks = min_wblocks; 2789 + sz = wblocks * hblocks * block_bytes; 2790 + return sz; 2768 2791 } 2769 2792 2770 2793 static int r100_cs_track_texture_check(struct radeon_device *rdev, ··· 2834 2797 h = h / (1 << i); 2835 2798 if (track->textures[u].roundup_h) 2836 2799 h = roundup_pow_of_two(h); 2837 - size += w * h; 2800 + if (track->textures[u].compress_format) { 2801 + 2802 + size += r100_track_compress_size(track->textures[u].compress_format, w, h); 2803 + /* compressed textures are block based */ 2804 + } else 2805 + size += w * h; 2838 2806 } 2839 2807 size *= track->textures[u].cpp; 2808 + 2840 2809 switch (track->textures[u].tex_coord_type) { 2841 2810 case 0: 2842 2811 break; ··· 3010 2967 track->arrays[i].esize = 0x7F; 3011 2968 } 3012 2969 for (i = 0; i < track->num_texture; i++) { 2970 + track->textures[i].compress_format = R100_TRACK_COMP_NONE; 3013 2971 track->textures[i].pitch = 16536; 3014 2972 track->textures[i].width = 16536; 3015 2973 track->textures[i].height = 16536; ··· 3443 3399 r100_errata(rdev); 3444 3400 /* Initialize clocks */ 3445 3401 radeon_get_clock_info(rdev->ddev); 3402 + /* Initialize power management */ 3403 + radeon_pm_init(rdev); 3446 3404 /* Get vram informations */ 3447 3405 r100_vram_info(rdev); 3448 3406 /* Initialize memory controller (also test AGP) */
+5
drivers/gpu/drm/radeon/r100_track.h
··· 28 28 unsigned height; 29 29 }; 30 30 31 + #define R100_TRACK_COMP_NONE 0 32 + #define R100_TRACK_COMP_DXT1 1 33 + #define R100_TRACK_COMP_DXT35 2 34 + 31 35 struct r100_cs_track_texture { 32 36 struct radeon_bo *robj; 33 37 struct r100_cs_cube_info cube_info[5]; /* info for 5 non-primary faces */ ··· 48 44 bool enabled; 49 45 bool roundup_w; 50 46 bool roundup_h; 47 + unsigned compress_format; 51 48 }; 52 49 53 50 struct r100_cs_track_limits {
+8 -2
drivers/gpu/drm/radeon/r200.c
··· 401 401 case R200_TXFORMAT_Y8: 402 402 track->textures[i].cpp = 1; 403 403 break; 404 - case R200_TXFORMAT_DXT1: 405 404 case R200_TXFORMAT_AI88: 406 405 case R200_TXFORMAT_ARGB1555: 407 406 case R200_TXFORMAT_RGB565: ··· 417 418 case R200_TXFORMAT_ABGR8888: 418 419 case R200_TXFORMAT_BGR111110: 419 420 case R200_TXFORMAT_LDVDU8888: 421 + track->textures[i].cpp = 4; 422 + break; 423 + case R200_TXFORMAT_DXT1: 424 + track->textures[i].cpp = 1; 425 + track->textures[i].compress_format = R100_TRACK_COMP_DXT1; 426 + break; 420 427 case R200_TXFORMAT_DXT23: 421 428 case R200_TXFORMAT_DXT45: 422 - track->textures[i].cpp = 4; 429 + track->textures[i].cpp = 1; 430 + track->textures[i].compress_format = R100_TRACK_COMP_DXT1; 423 431 break; 424 432 } 425 433 track->textures[i].cube_info[4].width = 1 << ((idx_value >> 16) & 0xf);
+20 -4
drivers/gpu/drm/radeon/r300.c
··· 686 686 r100_cs_dump_packet(p, pkt); 687 687 return r; 688 688 } 689 - ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); 689 + 690 + if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) 691 + tile_flags |= R300_TXO_MACRO_TILE; 692 + if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) 693 + tile_flags |= R300_TXO_MICRO_TILE; 694 + 695 + tmp = idx_value + ((u32)reloc->lobj.gpu_offset); 696 + tmp |= tile_flags; 697 + ib[idx] = tmp; 690 698 track->textures[i].robj = reloc->robj; 691 699 break; 692 700 /* Tracked registers */ ··· 860 852 case R300_TX_FORMAT_Z6Y5X5: 861 853 case R300_TX_FORMAT_W4Z4Y4X4: 862 854 case R300_TX_FORMAT_W1Z5Y5X5: 863 - case R300_TX_FORMAT_DXT1: 864 855 case R300_TX_FORMAT_D3DMFT_CxV8U8: 865 856 case R300_TX_FORMAT_B8G8_B8G8: 866 857 case R300_TX_FORMAT_G8R8_G8B8: ··· 873 866 case 0x17: 874 867 case R300_TX_FORMAT_FL_I32: 875 868 case 0x1e: 876 - case R300_TX_FORMAT_DXT3: 877 - case R300_TX_FORMAT_DXT5: 878 869 track->textures[i].cpp = 4; 879 870 break; 880 871 case R300_TX_FORMAT_W16Z16Y16X16: ··· 882 877 break; 883 878 case R300_TX_FORMAT_FL_R32G32B32A32: 884 879 track->textures[i].cpp = 16; 880 + break; 881 + case R300_TX_FORMAT_DXT1: 882 + track->textures[i].cpp = 1; 883 + track->textures[i].compress_format = R100_TRACK_COMP_DXT1; 884 + break; 885 + case R300_TX_FORMAT_DXT3: 886 + case R300_TX_FORMAT_DXT5: 887 + track->textures[i].cpp = 1; 888 + track->textures[i].compress_format = R100_TRACK_COMP_DXT35; 885 889 break; 886 890 default: 887 891 DRM_ERROR("Invalid texture format %u\n", ··· 1338 1324 r300_errata(rdev); 1339 1325 /* Initialize clocks */ 1340 1326 radeon_get_clock_info(rdev->ddev); 1327 + /* Initialize power management */ 1328 + radeon_pm_init(rdev); 1341 1329 /* Get vram informations */ 1342 1330 r300_vram_info(rdev); 1343 1331 /* Initialize memory controller (also test AGP) */
+13 -6
drivers/gpu/drm/radeon/r600.c
··· 1863 1863 } 1864 1864 r600_gpu_init(rdev); 1865 1865 1866 + if (!rdev->r600_blit.shader_obj) { 1867 + r = r600_blit_init(rdev); 1868 + if (r) { 1869 + DRM_ERROR("radeon: failed blitter (%d).\n", r); 1870 + return r; 1871 + } 1872 + } 1873 + 1866 1874 r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false); 1867 1875 if (unlikely(r != 0)) 1868 1876 return r; ··· 2046 2038 if (r) 2047 2039 return r; 2048 2040 2049 - r = r600_blit_init(rdev); 2050 - if (r) { 2051 - DRM_ERROR("radeon: failed blitter (%d).\n", r); 2052 - return r; 2053 - } 2054 - 2055 2041 rdev->accel_working = true; 2056 2042 r = r600_startup(rdev); 2057 2043 if (r) { ··· 2067 2065 rdev->accel_working = false; 2068 2066 } 2069 2067 } 2068 + 2069 + r = r600_audio_init(rdev); 2070 + if (r) 2071 + return r; /* TODO error handling */ 2070 2072 return 0; 2071 2073 } 2072 2074 ··· 2079 2073 /* Suspend operations */ 2080 2074 r600_suspend(rdev); 2081 2075 2076 + r600_audio_fini(rdev); 2082 2077 r600_blit_fini(rdev); 2083 2078 r600_irq_fini(rdev); 2084 2079 radeon_irq_kms_fini(rdev);
+267
drivers/gpu/drm/radeon/r600_audio.c
··· 1 + /* 2 + * Copyright 2008 Advanced Micro Devices, Inc. 3 + * Copyright 2008 Red Hat Inc. 4 + * Copyright 2009 Christian König. 5 + * 6 + * Permission is hereby granted, free of charge, to any person obtaining a 7 + * copy of this software and associated documentation files (the "Software"), 8 + * to deal in the Software without restriction, including without limitation 9 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10 + * and/or sell copies of the Software, and to permit persons to whom the 11 + * Software is furnished to do so, subject to the following conditions: 12 + * 13 + * The above copyright notice and this permission notice shall be included in 14 + * all copies or substantial portions of the Software. 15 + * 16 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 + * OTHER DEALINGS IN THE SOFTWARE. 23 + * 24 + * Authors: Christian König 25 + */ 26 + #include "drmP.h" 27 + #include "radeon.h" 28 + #include "radeon_reg.h" 29 + #include "atom.h" 30 + 31 + #define AUDIO_TIMER_INTERVALL 100 /* 1/10 sekund should be enough */ 32 + 33 + /* 34 + * check if the chipset is supported 35 + */ 36 + static int r600_audio_chipset_supported(struct radeon_device *rdev) 37 + { 38 + return rdev->family >= CHIP_R600 39 + || rdev->family == CHIP_RS600 40 + || rdev->family == CHIP_RS690 41 + || rdev->family == CHIP_RS740; 42 + } 43 + 44 + /* 45 + * current number of channels 46 + */ 47 + static int r600_audio_channels(struct radeon_device *rdev) 48 + { 49 + return (RREG32(R600_AUDIO_RATE_BPS_CHANNEL) & 0x7) + 1; 50 + } 51 + 52 + /* 53 + * current bits per sample 54 + */ 55 + static int r600_audio_bits_per_sample(struct radeon_device *rdev) 56 + { 57 + uint32_t value = (RREG32(R600_AUDIO_RATE_BPS_CHANNEL) & 0xF0) >> 4; 58 + switch (value) { 59 + case 0x0: return 8; 60 + case 0x1: return 16; 61 + case 0x2: return 20; 62 + case 0x3: return 24; 63 + case 0x4: return 32; 64 + } 65 + 66 + DRM_ERROR("Unknown bits per sample 0x%x using 16 instead.\n", (int)value); 67 + 68 + return 16; 69 + } 70 + 71 + /* 72 + * current sampling rate in HZ 73 + */ 74 + static int r600_audio_rate(struct radeon_device *rdev) 75 + { 76 + uint32_t value = RREG32(R600_AUDIO_RATE_BPS_CHANNEL); 77 + uint32_t result; 78 + 79 + if (value & 0x4000) 80 + result = 44100; 81 + else 82 + result = 48000; 83 + 84 + result *= ((value >> 11) & 0x7) + 1; 85 + result /= ((value >> 8) & 0x7) + 1; 86 + 87 + return result; 88 + } 89 + 90 + /* 91 + * iec 60958 status bits 92 + */ 93 + static uint8_t r600_audio_status_bits(struct radeon_device *rdev) 94 + { 95 + return RREG32(R600_AUDIO_STATUS_BITS) & 0xff; 96 + } 97 + 98 + /* 99 + * iec 60958 category code 100 + */ 101 + static uint8_t r600_audio_category_code(struct radeon_device *rdev) 102 + { 103 + return (RREG32(R600_AUDIO_STATUS_BITS) >> 8) & 0xff; 104 + } 105 + 106 + /* 107 + * update all hdmi interfaces with current audio parameters 108 + */ 109 + static void r600_audio_update_hdmi(unsigned long param) 110 + { 111 + struct radeon_device *rdev = (struct radeon_device *)param; 112 + struct drm_device *dev = rdev->ddev; 113 + 114 + int channels = r600_audio_channels(rdev); 115 + int rate = r600_audio_rate(rdev); 116 + int bps = r600_audio_bits_per_sample(rdev); 117 + uint8_t status_bits = r600_audio_status_bits(rdev); 118 + uint8_t category_code = r600_audio_category_code(rdev); 119 + 120 + struct drm_encoder *encoder; 121 + int changes = 0; 122 + 123 + changes |= channels != rdev->audio_channels; 124 + changes |= rate != rdev->audio_rate; 125 + changes |= bps != rdev->audio_bits_per_sample; 126 + changes |= status_bits != rdev->audio_status_bits; 127 + changes |= category_code != rdev->audio_category_code; 128 + 129 + if (changes) { 130 + rdev->audio_channels = channels; 131 + rdev->audio_rate = rate; 132 + rdev->audio_bits_per_sample = bps; 133 + rdev->audio_status_bits = status_bits; 134 + rdev->audio_category_code = category_code; 135 + } 136 + 137 + list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { 138 + if (changes || r600_hdmi_buffer_status_changed(encoder)) 139 + r600_hdmi_update_audio_settings( 140 + encoder, channels, 141 + rate, bps, status_bits, 142 + category_code); 143 + } 144 + 145 + mod_timer(&rdev->audio_timer, 146 + jiffies + msecs_to_jiffies(AUDIO_TIMER_INTERVALL)); 147 + } 148 + 149 + /* 150 + * initialize the audio vars and register the update timer 151 + */ 152 + int r600_audio_init(struct radeon_device *rdev) 153 + { 154 + if (!r600_audio_chipset_supported(rdev)) 155 + return 0; 156 + 157 + DRM_INFO("%s audio support", radeon_audio ? "Enabling" : "Disabling"); 158 + WREG32_P(R600_AUDIO_ENABLE, radeon_audio ? 0x81000000 : 0x0, ~0x81000000); 159 + 160 + rdev->audio_channels = -1; 161 + rdev->audio_rate = -1; 162 + rdev->audio_bits_per_sample = -1; 163 + rdev->audio_status_bits = 0; 164 + rdev->audio_category_code = 0; 165 + 166 + setup_timer( 167 + &rdev->audio_timer, 168 + r600_audio_update_hdmi, 169 + (unsigned long)rdev); 170 + 171 + mod_timer(&rdev->audio_timer, jiffies + 1); 172 + 173 + return 0; 174 + } 175 + 176 + /* 177 + * determin how the encoders and audio interface is wired together 178 + */ 179 + int r600_audio_tmds_index(struct drm_encoder *encoder) 180 + { 181 + struct drm_device *dev = encoder->dev; 182 + struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 183 + struct drm_encoder *other; 184 + 185 + switch (radeon_encoder->encoder_id) { 186 + case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1: 187 + case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: 188 + case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: 189 + return 0; 190 + 191 + case ENCODER_OBJECT_ID_INTERNAL_LVTM1: 192 + /* special case check if an TMDS1 is present */ 193 + list_for_each_entry(other, &dev->mode_config.encoder_list, head) { 194 + if (to_radeon_encoder(other)->encoder_id == 195 + ENCODER_OBJECT_ID_INTERNAL_TMDS1) 196 + return 1; 197 + } 198 + return 0; 199 + 200 + case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: 201 + case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: 202 + return 1; 203 + 204 + default: 205 + DRM_ERROR("Unsupported encoder type 0x%02X\n", 206 + radeon_encoder->encoder_id); 207 + return -1; 208 + } 209 + } 210 + 211 + /* 212 + * atach the audio codec to the clock source of the encoder 213 + */ 214 + void r600_audio_set_clock(struct drm_encoder *encoder, int clock) 215 + { 216 + struct drm_device *dev = encoder->dev; 217 + struct radeon_device *rdev = dev->dev_private; 218 + struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 219 + int base_rate = 48000; 220 + 221 + switch (radeon_encoder->encoder_id) { 222 + case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1: 223 + case ENCODER_OBJECT_ID_INTERNAL_LVTM1: 224 + WREG32_P(R600_AUDIO_TIMING, 0, ~0x301); 225 + break; 226 + 227 + case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: 228 + case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: 229 + case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: 230 + case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: 231 + WREG32_P(R600_AUDIO_TIMING, 0x100, ~0x301); 232 + break; 233 + 234 + default: 235 + DRM_ERROR("Unsupported encoder type 0x%02X\n", 236 + radeon_encoder->encoder_id); 237 + return; 238 + } 239 + 240 + switch (r600_audio_tmds_index(encoder)) { 241 + case 0: 242 + WREG32(R600_AUDIO_PLL1_MUL, base_rate*50); 243 + WREG32(R600_AUDIO_PLL1_DIV, clock*100); 244 + WREG32(R600_AUDIO_CLK_SRCSEL, 0); 245 + break; 246 + 247 + case 1: 248 + WREG32(R600_AUDIO_PLL2_MUL, base_rate*50); 249 + WREG32(R600_AUDIO_PLL2_DIV, clock*100); 250 + WREG32(R600_AUDIO_CLK_SRCSEL, 1); 251 + break; 252 + } 253 + } 254 + 255 + /* 256 + * release the audio timer 257 + * TODO: How to do this correctly on SMP systems? 258 + */ 259 + void r600_audio_fini(struct radeon_device *rdev) 260 + { 261 + if (!r600_audio_chipset_supported(rdev)) 262 + return; 263 + 264 + WREG32_P(R600_AUDIO_ENABLE, 0x0, ~0x81000000); 265 + 266 + del_timer(&rdev->audio_timer); 267 + }
+506
drivers/gpu/drm/radeon/r600_hdmi.c
··· 1 + /* 2 + * Copyright 2008 Advanced Micro Devices, Inc. 3 + * Copyright 2008 Red Hat Inc. 4 + * Copyright 2009 Christian König. 5 + * 6 + * Permission is hereby granted, free of charge, to any person obtaining a 7 + * copy of this software and associated documentation files (the "Software"), 8 + * to deal in the Software without restriction, including without limitation 9 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10 + * and/or sell copies of the Software, and to permit persons to whom the 11 + * Software is furnished to do so, subject to the following conditions: 12 + * 13 + * The above copyright notice and this permission notice shall be included in 14 + * all copies or substantial portions of the Software. 15 + * 16 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 + * OTHER DEALINGS IN THE SOFTWARE. 23 + * 24 + * Authors: Christian König 25 + */ 26 + #include "drmP.h" 27 + #include "radeon_drm.h" 28 + #include "radeon.h" 29 + #include "atom.h" 30 + 31 + /* 32 + * HDMI color format 33 + */ 34 + enum r600_hdmi_color_format { 35 + RGB = 0, 36 + YCC_422 = 1, 37 + YCC_444 = 2 38 + }; 39 + 40 + /* 41 + * IEC60958 status bits 42 + */ 43 + enum r600_hdmi_iec_status_bits { 44 + AUDIO_STATUS_DIG_ENABLE = 0x01, 45 + AUDIO_STATUS_V = 0x02, 46 + AUDIO_STATUS_VCFG = 0x04, 47 + AUDIO_STATUS_EMPHASIS = 0x08, 48 + AUDIO_STATUS_COPYRIGHT = 0x10, 49 + AUDIO_STATUS_NONAUDIO = 0x20, 50 + AUDIO_STATUS_PROFESSIONAL = 0x40, 51 + AUDIO_STATUS_LEVEL = 0x80 52 + }; 53 + 54 + struct { 55 + uint32_t Clock; 56 + 57 + int N_32kHz; 58 + int CTS_32kHz; 59 + 60 + int N_44_1kHz; 61 + int CTS_44_1kHz; 62 + 63 + int N_48kHz; 64 + int CTS_48kHz; 65 + 66 + } r600_hdmi_ACR[] = { 67 + /* 32kHz 44.1kHz 48kHz */ 68 + /* Clock N CTS N CTS N CTS */ 69 + { 25174, 4576, 28125, 7007, 31250, 6864, 28125 }, /* 25,20/1.001 MHz */ 70 + { 25200, 4096, 25200, 6272, 28000, 6144, 25200 }, /* 25.20 MHz */ 71 + { 27000, 4096, 27000, 6272, 30000, 6144, 27000 }, /* 27.00 MHz */ 72 + { 27027, 4096, 27027, 6272, 30030, 6144, 27027 }, /* 27.00*1.001 MHz */ 73 + { 54000, 4096, 54000, 6272, 60000, 6144, 54000 }, /* 54.00 MHz */ 74 + { 54054, 4096, 54054, 6272, 60060, 6144, 54054 }, /* 54.00*1.001 MHz */ 75 + { 74175, 11648, 210937, 17836, 234375, 11648, 140625 }, /* 74.25/1.001 MHz */ 76 + { 74250, 4096, 74250, 6272, 82500, 6144, 74250 }, /* 74.25 MHz */ 77 + { 148351, 11648, 421875, 8918, 234375, 5824, 140625 }, /* 148.50/1.001 MHz */ 78 + { 148500, 4096, 148500, 6272, 165000, 6144, 148500 }, /* 148.50 MHz */ 79 + { 0, 4096, 0, 6272, 0, 6144, 0 } /* Other */ 80 + }; 81 + 82 + /* 83 + * calculate CTS value if it's not found in the table 84 + */ 85 + static void r600_hdmi_calc_CTS(uint32_t clock, int *CTS, int N, int freq) 86 + { 87 + if (*CTS == 0) 88 + *CTS = clock*N/(128*freq)*1000; 89 + DRM_DEBUG("Using ACR timing N=%d CTS=%d for frequency %d\n", 90 + N, *CTS, freq); 91 + } 92 + 93 + /* 94 + * update the N and CTS parameters for a given pixel clock rate 95 + */ 96 + static void r600_hdmi_update_ACR(struct drm_encoder *encoder, uint32_t clock) 97 + { 98 + struct drm_device *dev = encoder->dev; 99 + struct radeon_device *rdev = dev->dev_private; 100 + uint32_t offset = to_radeon_encoder(encoder)->hdmi_offset; 101 + int CTS; 102 + int N; 103 + int i; 104 + 105 + for (i = 0; r600_hdmi_ACR[i].Clock != clock && r600_hdmi_ACR[i].Clock != 0; i++); 106 + 107 + CTS = r600_hdmi_ACR[i].CTS_32kHz; 108 + N = r600_hdmi_ACR[i].N_32kHz; 109 + r600_hdmi_calc_CTS(clock, &CTS, N, 32000); 110 + WREG32(offset+R600_HDMI_32kHz_CTS, CTS << 12); 111 + WREG32(offset+R600_HDMI_32kHz_N, N); 112 + 113 + CTS = r600_hdmi_ACR[i].CTS_44_1kHz; 114 + N = r600_hdmi_ACR[i].N_44_1kHz; 115 + r600_hdmi_calc_CTS(clock, &CTS, N, 44100); 116 + WREG32(offset+R600_HDMI_44_1kHz_CTS, CTS << 12); 117 + WREG32(offset+R600_HDMI_44_1kHz_N, N); 118 + 119 + CTS = r600_hdmi_ACR[i].CTS_48kHz; 120 + N = r600_hdmi_ACR[i].N_48kHz; 121 + r600_hdmi_calc_CTS(clock, &CTS, N, 48000); 122 + WREG32(offset+R600_HDMI_48kHz_CTS, CTS << 12); 123 + WREG32(offset+R600_HDMI_48kHz_N, N); 124 + } 125 + 126 + /* 127 + * calculate the crc for a given info frame 128 + */ 129 + static void r600_hdmi_infoframe_checksum(uint8_t packetType, 130 + uint8_t versionNumber, 131 + uint8_t length, 132 + uint8_t *frame) 133 + { 134 + int i; 135 + frame[0] = packetType + versionNumber + length; 136 + for (i = 1; i <= length; i++) 137 + frame[0] += frame[i]; 138 + frame[0] = 0x100 - frame[0]; 139 + } 140 + 141 + /* 142 + * build a HDMI Video Info Frame 143 + */ 144 + static void r600_hdmi_videoinfoframe( 145 + struct drm_encoder *encoder, 146 + enum r600_hdmi_color_format color_format, 147 + int active_information_present, 148 + uint8_t active_format_aspect_ratio, 149 + uint8_t scan_information, 150 + uint8_t colorimetry, 151 + uint8_t ex_colorimetry, 152 + uint8_t quantization, 153 + int ITC, 154 + uint8_t picture_aspect_ratio, 155 + uint8_t video_format_identification, 156 + uint8_t pixel_repetition, 157 + uint8_t non_uniform_picture_scaling, 158 + uint8_t bar_info_data_valid, 159 + uint16_t top_bar, 160 + uint16_t bottom_bar, 161 + uint16_t left_bar, 162 + uint16_t right_bar 163 + ) 164 + { 165 + struct drm_device *dev = encoder->dev; 166 + struct radeon_device *rdev = dev->dev_private; 167 + uint32_t offset = to_radeon_encoder(encoder)->hdmi_offset; 168 + 169 + uint8_t frame[14]; 170 + 171 + frame[0x0] = 0; 172 + frame[0x1] = 173 + (scan_information & 0x3) | 174 + ((bar_info_data_valid & 0x3) << 2) | 175 + ((active_information_present & 0x1) << 4) | 176 + ((color_format & 0x3) << 5); 177 + frame[0x2] = 178 + (active_format_aspect_ratio & 0xF) | 179 + ((picture_aspect_ratio & 0x3) << 4) | 180 + ((colorimetry & 0x3) << 6); 181 + frame[0x3] = 182 + (non_uniform_picture_scaling & 0x3) | 183 + ((quantization & 0x3) << 2) | 184 + ((ex_colorimetry & 0x7) << 4) | 185 + ((ITC & 0x1) << 7); 186 + frame[0x4] = (video_format_identification & 0x7F); 187 + frame[0x5] = (pixel_repetition & 0xF); 188 + frame[0x6] = (top_bar & 0xFF); 189 + frame[0x7] = (top_bar >> 8); 190 + frame[0x8] = (bottom_bar & 0xFF); 191 + frame[0x9] = (bottom_bar >> 8); 192 + frame[0xA] = (left_bar & 0xFF); 193 + frame[0xB] = (left_bar >> 8); 194 + frame[0xC] = (right_bar & 0xFF); 195 + frame[0xD] = (right_bar >> 8); 196 + 197 + r600_hdmi_infoframe_checksum(0x82, 0x02, 0x0D, frame); 198 + 199 + WREG32(offset+R600_HDMI_VIDEOINFOFRAME_0, 200 + frame[0x0] | (frame[0x1] << 8) | (frame[0x2] << 16) | (frame[0x3] << 24)); 201 + WREG32(offset+R600_HDMI_VIDEOINFOFRAME_1, 202 + frame[0x4] | (frame[0x5] << 8) | (frame[0x6] << 16) | (frame[0x7] << 24)); 203 + WREG32(offset+R600_HDMI_VIDEOINFOFRAME_2, 204 + frame[0x8] | (frame[0x9] << 8) | (frame[0xA] << 16) | (frame[0xB] << 24)); 205 + WREG32(offset+R600_HDMI_VIDEOINFOFRAME_3, 206 + frame[0xC] | (frame[0xD] << 8)); 207 + } 208 + 209 + /* 210 + * build a Audio Info Frame 211 + */ 212 + static void r600_hdmi_audioinfoframe( 213 + struct drm_encoder *encoder, 214 + uint8_t channel_count, 215 + uint8_t coding_type, 216 + uint8_t sample_size, 217 + uint8_t sample_frequency, 218 + uint8_t format, 219 + uint8_t channel_allocation, 220 + uint8_t level_shift, 221 + int downmix_inhibit 222 + ) 223 + { 224 + struct drm_device *dev = encoder->dev; 225 + struct radeon_device *rdev = dev->dev_private; 226 + uint32_t offset = to_radeon_encoder(encoder)->hdmi_offset; 227 + 228 + uint8_t frame[11]; 229 + 230 + frame[0x0] = 0; 231 + frame[0x1] = (channel_count & 0x7) | ((coding_type & 0xF) << 4); 232 + frame[0x2] = (sample_size & 0x3) | ((sample_frequency & 0x7) << 2); 233 + frame[0x3] = format; 234 + frame[0x4] = channel_allocation; 235 + frame[0x5] = ((level_shift & 0xF) << 3) | ((downmix_inhibit & 0x1) << 7); 236 + frame[0x6] = 0; 237 + frame[0x7] = 0; 238 + frame[0x8] = 0; 239 + frame[0x9] = 0; 240 + frame[0xA] = 0; 241 + 242 + r600_hdmi_infoframe_checksum(0x84, 0x01, 0x0A, frame); 243 + 244 + WREG32(offset+R600_HDMI_AUDIOINFOFRAME_0, 245 + frame[0x0] | (frame[0x1] << 8) | (frame[0x2] << 16) | (frame[0x3] << 24)); 246 + WREG32(offset+R600_HDMI_AUDIOINFOFRAME_1, 247 + frame[0x4] | (frame[0x5] << 8) | (frame[0x6] << 16) | (frame[0x8] << 24)); 248 + } 249 + 250 + /* 251 + * test if audio buffer is filled enough to start playing 252 + */ 253 + static int r600_hdmi_is_audio_buffer_filled(struct drm_encoder *encoder) 254 + { 255 + struct drm_device *dev = encoder->dev; 256 + struct radeon_device *rdev = dev->dev_private; 257 + uint32_t offset = to_radeon_encoder(encoder)->hdmi_offset; 258 + 259 + return (RREG32(offset+R600_HDMI_STATUS) & 0x10) != 0; 260 + } 261 + 262 + /* 263 + * have buffer status changed since last call? 264 + */ 265 + int r600_hdmi_buffer_status_changed(struct drm_encoder *encoder) 266 + { 267 + struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 268 + int status, result; 269 + 270 + if (!radeon_encoder->hdmi_offset) 271 + return 0; 272 + 273 + status = r600_hdmi_is_audio_buffer_filled(encoder); 274 + result = radeon_encoder->hdmi_buffer_status != status; 275 + radeon_encoder->hdmi_buffer_status = status; 276 + 277 + return result; 278 + } 279 + 280 + /* 281 + * write the audio workaround status to the hardware 282 + */ 283 + void r600_hdmi_audio_workaround(struct drm_encoder *encoder) 284 + { 285 + struct drm_device *dev = encoder->dev; 286 + struct radeon_device *rdev = dev->dev_private; 287 + struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 288 + uint32_t offset = radeon_encoder->hdmi_offset; 289 + 290 + if (!offset) 291 + return; 292 + 293 + if (r600_hdmi_is_audio_buffer_filled(encoder)) { 294 + /* disable audio workaround and start delivering of audio frames */ 295 + WREG32_P(offset+R600_HDMI_CNTL, 0x00000001, ~0x00001001); 296 + 297 + } else if (radeon_encoder->hdmi_audio_workaround) { 298 + /* enable audio workaround and start delivering of audio frames */ 299 + WREG32_P(offset+R600_HDMI_CNTL, 0x00001001, ~0x00001001); 300 + 301 + } else { 302 + /* disable audio workaround and stop delivering of audio frames */ 303 + WREG32_P(offset+R600_HDMI_CNTL, 0x00000000, ~0x00001001); 304 + } 305 + } 306 + 307 + 308 + /* 309 + * update the info frames with the data from the current display mode 310 + */ 311 + void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mode) 312 + { 313 + struct drm_device *dev = encoder->dev; 314 + struct radeon_device *rdev = dev->dev_private; 315 + uint32_t offset = to_radeon_encoder(encoder)->hdmi_offset; 316 + 317 + if (!offset) 318 + return; 319 + 320 + r600_audio_set_clock(encoder, mode->clock); 321 + 322 + WREG32(offset+R600_HDMI_UNKNOWN_0, 0x1000); 323 + WREG32(offset+R600_HDMI_UNKNOWN_1, 0x0); 324 + WREG32(offset+R600_HDMI_UNKNOWN_2, 0x1000); 325 + 326 + r600_hdmi_update_ACR(encoder, mode->clock); 327 + 328 + WREG32(offset+R600_HDMI_VIDEOCNTL, 0x13); 329 + 330 + WREG32(offset+R600_HDMI_VERSION, 0x202); 331 + 332 + r600_hdmi_videoinfoframe(encoder, RGB, 0, 0, 0, 0, 333 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); 334 + 335 + /* it's unknown what these bits do excatly, but it's indeed quite usefull for debugging */ 336 + WREG32(offset+R600_HDMI_AUDIO_DEBUG_0, 0x00FFFFFF); 337 + WREG32(offset+R600_HDMI_AUDIO_DEBUG_1, 0x007FFFFF); 338 + WREG32(offset+R600_HDMI_AUDIO_DEBUG_2, 0x00000001); 339 + WREG32(offset+R600_HDMI_AUDIO_DEBUG_3, 0x00000001); 340 + 341 + r600_hdmi_audio_workaround(encoder); 342 + 343 + /* audio packets per line, does anyone know how to calc this ? */ 344 + WREG32_P(offset+R600_HDMI_CNTL, 0x00040000, ~0x001F0000); 345 + 346 + /* update? reset? don't realy know */ 347 + WREG32_P(offset+R600_HDMI_CNTL, 0x14000000, ~0x14000000); 348 + } 349 + 350 + /* 351 + * update settings with current parameters from audio engine 352 + */ 353 + void r600_hdmi_update_audio_settings(struct drm_encoder *encoder, 354 + int channels, 355 + int rate, 356 + int bps, 357 + uint8_t status_bits, 358 + uint8_t category_code) 359 + { 360 + struct drm_device *dev = encoder->dev; 361 + struct radeon_device *rdev = dev->dev_private; 362 + uint32_t offset = to_radeon_encoder(encoder)->hdmi_offset; 363 + 364 + uint32_t iec; 365 + 366 + if (!offset) 367 + return; 368 + 369 + DRM_DEBUG("%s with %d channels, %d Hz sampling rate, %d bits per sample,\n", 370 + r600_hdmi_is_audio_buffer_filled(encoder) ? "playing" : "stopped", 371 + channels, rate, bps); 372 + DRM_DEBUG("0x%02X IEC60958 status bits and 0x%02X category code\n", 373 + (int)status_bits, (int)category_code); 374 + 375 + iec = 0; 376 + if (status_bits & AUDIO_STATUS_PROFESSIONAL) 377 + iec |= 1 << 0; 378 + if (status_bits & AUDIO_STATUS_NONAUDIO) 379 + iec |= 1 << 1; 380 + if (status_bits & AUDIO_STATUS_COPYRIGHT) 381 + iec |= 1 << 2; 382 + if (status_bits & AUDIO_STATUS_EMPHASIS) 383 + iec |= 1 << 3; 384 + 385 + iec |= category_code << 8; 386 + 387 + switch (rate) { 388 + case 32000: iec |= 0x3 << 24; break; 389 + case 44100: iec |= 0x0 << 24; break; 390 + case 88200: iec |= 0x8 << 24; break; 391 + case 176400: iec |= 0xc << 24; break; 392 + case 48000: iec |= 0x2 << 24; break; 393 + case 96000: iec |= 0xa << 24; break; 394 + case 192000: iec |= 0xe << 24; break; 395 + } 396 + 397 + WREG32(offset+R600_HDMI_IEC60958_1, iec); 398 + 399 + iec = 0; 400 + switch (bps) { 401 + case 16: iec |= 0x2; break; 402 + case 20: iec |= 0x3; break; 403 + case 24: iec |= 0xb; break; 404 + } 405 + if (status_bits & AUDIO_STATUS_V) 406 + iec |= 0x5 << 16; 407 + 408 + WREG32_P(offset+R600_HDMI_IEC60958_2, iec, ~0x5000f); 409 + 410 + /* 0x021 or 0x031 sets the audio frame length */ 411 + WREG32(offset+R600_HDMI_AUDIOCNTL, 0x31); 412 + r600_hdmi_audioinfoframe(encoder, channels-1, 0, 0, 0, 0, 0, 0, 0); 413 + 414 + r600_hdmi_audio_workaround(encoder); 415 + 416 + /* update? reset? don't realy know */ 417 + WREG32_P(offset+R600_HDMI_CNTL, 0x04000000, ~0x04000000); 418 + } 419 + 420 + /* 421 + * enable/disable the HDMI engine 422 + */ 423 + void r600_hdmi_enable(struct drm_encoder *encoder, int enable) 424 + { 425 + struct drm_device *dev = encoder->dev; 426 + struct radeon_device *rdev = dev->dev_private; 427 + struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 428 + uint32_t offset = to_radeon_encoder(encoder)->hdmi_offset; 429 + 430 + if (!offset) 431 + return; 432 + 433 + DRM_DEBUG("%s HDMI interface @ 0x%04X\n", enable ? "Enabling" : "Disabling", offset); 434 + 435 + /* some version of atombios ignore the enable HDMI flag 436 + * so enabling/disabling HDMI was moved here for TMDS1+2 */ 437 + switch (radeon_encoder->encoder_id) { 438 + case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1: 439 + WREG32_P(AVIVO_TMDSA_CNTL, enable ? 0x4 : 0x0, ~0x4); 440 + WREG32(offset+R600_HDMI_ENABLE, enable ? 0x101 : 0x0); 441 + break; 442 + 443 + case ENCODER_OBJECT_ID_INTERNAL_LVTM1: 444 + WREG32_P(AVIVO_LVTMA_CNTL, enable ? 0x4 : 0x0, ~0x4); 445 + WREG32(offset+R600_HDMI_ENABLE, enable ? 0x105 : 0x0); 446 + break; 447 + 448 + case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: 449 + case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: 450 + case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: 451 + case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: 452 + /* This part is doubtfull in my opinion */ 453 + WREG32(offset+R600_HDMI_ENABLE, enable ? 0x110 : 0x0); 454 + break; 455 + 456 + default: 457 + DRM_ERROR("unknown HDMI output type\n"); 458 + break; 459 + } 460 + } 461 + 462 + /* 463 + * determin at which register offset the HDMI encoder is 464 + */ 465 + void r600_hdmi_init(struct drm_encoder *encoder) 466 + { 467 + struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 468 + 469 + switch (radeon_encoder->encoder_id) { 470 + case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1: 471 + case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: 472 + case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: 473 + radeon_encoder->hdmi_offset = R600_HDMI_TMDS1; 474 + break; 475 + 476 + case ENCODER_OBJECT_ID_INTERNAL_LVTM1: 477 + switch (r600_audio_tmds_index(encoder)) { 478 + case 0: 479 + radeon_encoder->hdmi_offset = R600_HDMI_TMDS1; 480 + break; 481 + case 1: 482 + radeon_encoder->hdmi_offset = R600_HDMI_TMDS2; 483 + break; 484 + default: 485 + radeon_encoder->hdmi_offset = 0; 486 + break; 487 + } 488 + case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: 489 + radeon_encoder->hdmi_offset = R600_HDMI_TMDS2; 490 + break; 491 + 492 + case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: 493 + radeon_encoder->hdmi_offset = R600_HDMI_DIG; 494 + break; 495 + 496 + default: 497 + radeon_encoder->hdmi_offset = 0; 498 + break; 499 + } 500 + 501 + DRM_DEBUG("using HDMI engine at offset 0x%04X for encoder 0x%x\n", 502 + radeon_encoder->hdmi_offset, radeon_encoder->encoder_id); 503 + 504 + /* TODO: make this configureable */ 505 + radeon_encoder->hdmi_audio_workaround = 0; 506 + }
+74
drivers/gpu/drm/radeon/r600_reg.h
··· 110 110 #define R600_BIOS_6_SCRATCH 0x173c 111 111 #define R600_BIOS_7_SCRATCH 0x1740 112 112 113 + /* Audio, these regs were reverse enginered, 114 + * so the chance is high that the naming is wrong 115 + * R6xx+ ??? */ 116 + 117 + /* Audio clocks */ 118 + #define R600_AUDIO_PLL1_MUL 0x0514 119 + #define R600_AUDIO_PLL1_DIV 0x0518 120 + #define R600_AUDIO_PLL2_MUL 0x0524 121 + #define R600_AUDIO_PLL2_DIV 0x0528 122 + #define R600_AUDIO_CLK_SRCSEL 0x0534 123 + 124 + /* Audio general */ 125 + #define R600_AUDIO_ENABLE 0x7300 126 + #define R600_AUDIO_TIMING 0x7344 127 + 128 + /* Audio params */ 129 + #define R600_AUDIO_VENDOR_ID 0x7380 130 + #define R600_AUDIO_REVISION_ID 0x7384 131 + #define R600_AUDIO_ROOT_NODE_COUNT 0x7388 132 + #define R600_AUDIO_NID1_NODE_COUNT 0x738c 133 + #define R600_AUDIO_NID1_TYPE 0x7390 134 + #define R600_AUDIO_SUPPORTED_SIZE_RATE 0x7394 135 + #define R600_AUDIO_SUPPORTED_CODEC 0x7398 136 + #define R600_AUDIO_SUPPORTED_POWER_STATES 0x739c 137 + #define R600_AUDIO_NID2_CAPS 0x73a0 138 + #define R600_AUDIO_NID3_CAPS 0x73a4 139 + #define R600_AUDIO_NID3_PIN_CAPS 0x73a8 140 + 141 + /* Audio conn list */ 142 + #define R600_AUDIO_CONN_LIST_LEN 0x73ac 143 + #define R600_AUDIO_CONN_LIST 0x73b0 144 + 145 + /* Audio verbs */ 146 + #define R600_AUDIO_RATE_BPS_CHANNEL 0x73c0 147 + #define R600_AUDIO_PLAYING 0x73c4 148 + #define R600_AUDIO_IMPLEMENTATION_ID 0x73c8 149 + #define R600_AUDIO_CONFIG_DEFAULT 0x73cc 150 + #define R600_AUDIO_PIN_SENSE 0x73d0 151 + #define R600_AUDIO_PIN_WIDGET_CNTL 0x73d4 152 + #define R600_AUDIO_STATUS_BITS 0x73d8 153 + 154 + /* HDMI base register addresses */ 155 + #define R600_HDMI_TMDS1 0x7400 156 + #define R600_HDMI_TMDS2 0x7700 157 + #define R600_HDMI_DIG 0x7800 158 + 159 + /* HDMI registers */ 160 + #define R600_HDMI_ENABLE 0x00 161 + #define R600_HDMI_STATUS 0x04 162 + #define R600_HDMI_CNTL 0x08 163 + #define R600_HDMI_UNKNOWN_0 0x0C 164 + #define R600_HDMI_AUDIOCNTL 0x10 165 + #define R600_HDMI_VIDEOCNTL 0x14 166 + #define R600_HDMI_VERSION 0x18 167 + #define R600_HDMI_UNKNOWN_1 0x28 168 + #define R600_HDMI_VIDEOINFOFRAME_0 0x54 169 + #define R600_HDMI_VIDEOINFOFRAME_1 0x58 170 + #define R600_HDMI_VIDEOINFOFRAME_2 0x5c 171 + #define R600_HDMI_VIDEOINFOFRAME_3 0x60 172 + #define R600_HDMI_32kHz_CTS 0xac 173 + #define R600_HDMI_32kHz_N 0xb0 174 + #define R600_HDMI_44_1kHz_CTS 0xb4 175 + #define R600_HDMI_44_1kHz_N 0xb8 176 + #define R600_HDMI_48kHz_CTS 0xbc 177 + #define R600_HDMI_48kHz_N 0xc0 178 + #define R600_HDMI_AUDIOINFOFRAME_0 0xcc 179 + #define R600_HDMI_AUDIOINFOFRAME_1 0xd0 180 + #define R600_HDMI_IEC60958_1 0xd4 181 + #define R600_HDMI_IEC60958_2 0xd8 182 + #define R600_HDMI_UNKNOWN_2 0xdc 183 + #define R600_HDMI_AUDIO_DEBUG_0 0xe0 184 + #define R600_HDMI_AUDIO_DEBUG_1 0xe4 185 + #define R600_HDMI_AUDIO_DEBUG_2 0xe8 186 + #define R600_HDMI_AUDIO_DEBUG_3 0xec 113 187 114 188 #endif
+25
drivers/gpu/drm/radeon/radeon.h
··· 89 89 extern int radeon_connector_table; 90 90 extern int radeon_tv; 91 91 extern int radeon_new_pll; 92 + extern int radeon_audio; 92 93 93 94 /* 94 95 * Copy from radeon_drv.h so we don't have to include both and have conflicting ··· 815 814 struct r600_ih ih; /* r6/700 interrupt ring */ 816 815 struct workqueue_struct *wq; 817 816 struct work_struct hotplug_work; 817 + 818 + /* audio stuff */ 819 + struct timer_list audio_timer; 820 + int audio_channels; 821 + int audio_rate; 822 + int audio_bits_per_sample; 823 + uint8_t audio_status_bits; 824 + uint8_t audio_category_code; 818 825 }; 819 826 820 827 int radeon_device_init(struct radeon_device *rdev, ··· 1025 1016 extern void radeon_legacy_set_clock_gating(struct radeon_device *rdev, int enable); 1026 1017 extern void radeon_atom_set_clock_gating(struct radeon_device *rdev, int enable); 1027 1018 extern void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain); 1019 + extern bool radeon_ttm_bo_is_radeon_bo(struct ttm_buffer_object *bo); 1028 1020 1029 1021 /* r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280 */ 1030 1022 struct r100_mc_save { ··· 1155 1145 extern void r600_irq_fini(struct radeon_device *rdev); 1156 1146 extern void r600_ih_ring_init(struct radeon_device *rdev, unsigned ring_size); 1157 1147 extern int r600_irq_set(struct radeon_device *rdev); 1148 + 1149 + extern int r600_audio_init(struct radeon_device *rdev); 1150 + extern int r600_audio_tmds_index(struct drm_encoder *encoder); 1151 + extern void r600_audio_set_clock(struct drm_encoder *encoder, int clock); 1152 + extern void r600_audio_fini(struct radeon_device *rdev); 1153 + extern void r600_hdmi_init(struct drm_encoder *encoder); 1154 + extern void r600_hdmi_enable(struct drm_encoder *encoder, int enable); 1155 + extern void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mode); 1156 + extern int r600_hdmi_buffer_status_changed(struct drm_encoder *encoder); 1157 + extern void r600_hdmi_update_audio_settings(struct drm_encoder *encoder, 1158 + int channels, 1159 + int rate, 1160 + int bps, 1161 + uint8_t status_bits, 1162 + uint8_t category_code); 1158 1163 1159 1164 #include "radeon_object.h" 1160 1165
+4
drivers/gpu/drm/radeon/radeon_drv.c
··· 87 87 int radeon_connector_table = 0; 88 88 int radeon_tv = 1; 89 89 int radeon_new_pll = 1; 90 + int radeon_audio = 1; 90 91 91 92 MODULE_PARM_DESC(no_wb, "Disable AGP writeback for scratch registers"); 92 93 module_param_named(no_wb, radeon_no_wb, int, 0444); ··· 124 123 125 124 MODULE_PARM_DESC(new_pll, "Select new PLL code for AVIVO chips"); 126 125 module_param_named(new_pll, radeon_new_pll, int, 0444); 126 + 127 + MODULE_PARM_DESC(audio, "Audio enable (0 = disable)"); 128 + module_param_named(audio, radeon_audio, int, 0444); 127 129 128 130 static int radeon_suspend(struct drm_device *dev, pm_message_t state) 129 131 {
+11 -5
drivers/gpu/drm/radeon/radeon_encoders.c
··· 438 438 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 439 439 union lvds_encoder_control args; 440 440 int index = 0; 441 + int hdmi_detected = 0; 441 442 uint8_t frev, crev; 442 443 struct radeon_encoder_atom_dig *dig; 443 444 struct drm_connector *connector; ··· 458 457 459 458 if (!radeon_connector->con_priv) 460 459 return; 460 + 461 + if (drm_detect_hdmi_monitor(radeon_connector->edid)) 462 + hdmi_detected = 1; 461 463 462 464 dig_connector = radeon_connector->con_priv; 463 465 ··· 491 487 case 1: 492 488 args.v1.ucMisc = 0; 493 489 args.v1.ucAction = action; 494 - if (drm_detect_hdmi_monitor(radeon_connector->edid)) 490 + if (hdmi_detected) 495 491 args.v1.ucMisc |= PANEL_ENCODER_MISC_HDMI_TYPE; 496 492 args.v1.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); 497 493 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) { ··· 516 512 if (dig->coherent_mode) 517 513 args.v2.ucMisc |= PANEL_ENCODER_MISC_COHERENT; 518 514 } 519 - if (drm_detect_hdmi_monitor(radeon_connector->edid)) 515 + if (hdmi_detected) 520 516 args.v2.ucMisc |= PANEL_ENCODER_MISC_HDMI_TYPE; 521 517 args.v2.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); 522 518 args.v2.ucTruncate = 0; ··· 556 552 } 557 553 558 554 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 559 - 555 + r600_hdmi_enable(encoder, hdmi_detected); 560 556 } 561 557 562 558 int ··· 897 893 } 898 894 899 895 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 900 - 901 896 } 902 897 903 898 static void ··· 1165 1162 } 1166 1163 1167 1164 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 1168 - 1169 1165 } 1170 1166 1171 1167 static void ··· 1267 1265 break; 1268 1266 } 1269 1267 atombios_apply_encoder_quirks(encoder, adjusted_mode); 1268 + 1269 + r600_hdmi_setmode(encoder, adjusted_mode); 1270 1270 } 1271 1271 1272 1272 static bool ··· 1514 1510 drm_encoder_helper_add(encoder, &radeon_atom_dig_helper_funcs); 1515 1511 break; 1516 1512 } 1513 + 1514 + r600_hdmi_init(encoder); 1517 1515 }
+5 -3
drivers/gpu/drm/radeon/radeon_gem.c
··· 66 66 } 67 67 r = radeon_bo_create(rdev, gobj, size, kernel, initial_domain, &robj); 68 68 if (r) { 69 - DRM_ERROR("Failed to allocate GEM object (%d, %d, %u)\n", 70 - size, initial_domain, alignment); 69 + if (r != -ERESTARTSYS) 70 + DRM_ERROR("Failed to allocate GEM object (%d, %d, %u, %d)\n", 71 + size, initial_domain, alignment, r); 71 72 mutex_lock(&rdev->ddev->struct_mutex); 72 73 drm_gem_object_unreference(gobj); 73 74 mutex_unlock(&rdev->ddev->struct_mutex); ··· 351 350 rbo = gobj->driver_private; 352 351 r = radeon_bo_reserve(rbo, false); 353 352 if (unlikely(r != 0)) 354 - return r; 353 + goto out; 355 354 radeon_bo_get_tiling_flags(rbo, &args->tiling_flags, &args->pitch); 356 355 radeon_bo_unreserve(rbo); 356 + out: 357 357 mutex_lock(&dev->struct_mutex); 358 358 drm_gem_object_unreference(gobj); 359 359 mutex_unlock(&dev->struct_mutex);
+3
drivers/gpu/drm/radeon/radeon_mode.h
··· 334 334 enum radeon_rmx_type rmx_type; 335 335 struct drm_display_mode native_mode; 336 336 void *enc_priv; 337 + int hdmi_offset; 338 + int hdmi_audio_workaround; 339 + int hdmi_buffer_status; 337 340 }; 338 341 339 342 struct radeon_connector_atom_dig {
+18 -3
drivers/gpu/drm/radeon/radeon_object.c
··· 56 56 kfree(bo); 57 57 } 58 58 59 + bool radeon_ttm_bo_is_radeon_bo(struct ttm_buffer_object *bo) 60 + { 61 + if (bo->destroy == &radeon_ttm_bo_destroy) 62 + return true; 63 + return false; 64 + } 65 + 59 66 void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain) 60 67 { 61 68 u32 c = 0; ··· 77 70 if (domain & RADEON_GEM_DOMAIN_GTT) 78 71 rbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_TT; 79 72 if (domain & RADEON_GEM_DOMAIN_CPU) 73 + rbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM; 74 + if (!c) 80 75 rbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM; 81 76 rbo->placement.num_placement = c; 82 77 rbo->placement.num_busy_placement = c; ··· 490 481 } 491 482 492 483 void radeon_bo_move_notify(struct ttm_buffer_object *bo, 493 - struct ttm_mem_reg *mem) 484 + struct ttm_mem_reg *mem) 494 485 { 495 - struct radeon_bo *rbo = container_of(bo, struct radeon_bo, tbo); 486 + struct radeon_bo *rbo; 487 + if (!radeon_ttm_bo_is_radeon_bo(bo)) 488 + return; 489 + rbo = container_of(bo, struct radeon_bo, tbo); 496 490 radeon_bo_check_tiling(rbo, 0, 1); 497 491 } 498 492 499 493 void radeon_bo_fault_reserve_notify(struct ttm_buffer_object *bo) 500 494 { 501 - struct radeon_bo *rbo = container_of(bo, struct radeon_bo, tbo); 495 + struct radeon_bo *rbo; 496 + if (!radeon_ttm_bo_is_radeon_bo(bo)) 497 + return; 498 + rbo = container_of(bo, struct radeon_bo, tbo); 502 499 radeon_bo_check_tiling(rbo, 0, 0); 503 500 }
+5 -11
drivers/gpu/drm/radeon/radeon_object.h
··· 59 59 * 60 60 * Returns: 61 61 * -EBUSY: buffer is busy and @no_wait is true 62 - * -ERESTART: A wait for the buffer to become unreserved was interrupted by 62 + * -ERESTARTSYS: A wait for the buffer to become unreserved was interrupted by 63 63 * a signal. Release all buffer reservations and return to user-space. 64 64 */ 65 65 static inline int radeon_bo_reserve(struct radeon_bo *bo, bool no_wait) 66 66 { 67 67 int r; 68 68 69 - retry: 70 69 r = ttm_bo_reserve(&bo->tbo, true, no_wait, false, 0); 71 70 if (unlikely(r != 0)) { 72 - if (r == -ERESTART) 73 - goto retry; 74 - dev_err(bo->rdev->dev, "%p reserve failed\n", bo); 71 + if (r != -ERESTARTSYS) 72 + dev_err(bo->rdev->dev, "%p reserve failed\n", bo); 75 73 return r; 76 74 } 77 75 return 0; ··· 123 125 { 124 126 int r; 125 127 126 - retry: 127 128 r = ttm_bo_reserve(&bo->tbo, true, no_wait, false, 0); 128 129 if (unlikely(r != 0)) { 129 - if (r == -ERESTART) 130 - goto retry; 131 - dev_err(bo->rdev->dev, "%p reserve failed for wait\n", bo); 130 + if (r != -ERESTARTSYS) 131 + dev_err(bo->rdev->dev, "%p reserve failed for wait\n", bo); 132 132 return r; 133 133 } 134 134 spin_lock(&bo->tbo.lock); ··· 136 140 r = ttm_bo_wait(&bo->tbo, true, true, no_wait); 137 141 spin_unlock(&bo->tbo.lock); 138 142 ttm_bo_unreserve(&bo->tbo); 139 - if (unlikely(r == -ERESTART)) 140 - goto retry; 141 143 return r; 142 144 } 143 145
+5 -2
drivers/gpu/drm/radeon/radeon_pm.c
··· 44 44 struct drm_device *dev = node->minor->dev; 45 45 struct radeon_device *rdev = dev->dev_private; 46 46 47 - seq_printf(m, "engine clock: %u0 kHz\n", radeon_get_engine_clock(rdev)); 48 - seq_printf(m, "memory clock: %u0 kHz\n", radeon_get_memory_clock(rdev)); 47 + seq_printf(m, "default engine clock: %u0 kHz\n", rdev->clock.default_sclk); 48 + seq_printf(m, "current engine clock: %u0 kHz\n", radeon_get_engine_clock(rdev)); 49 + seq_printf(m, "default memory clock: %u0 kHz\n", rdev->clock.default_mclk); 50 + if (rdev->asic->get_memory_clock) 51 + seq_printf(m, "current memory clock: %u0 kHz\n", radeon_get_memory_clock(rdev)); 49 52 50 53 return 0; 51 54 }
+13 -1
drivers/gpu/drm/radeon/radeon_ttm.c
··· 200 200 static void radeon_evict_flags(struct ttm_buffer_object *bo, 201 201 struct ttm_placement *placement) 202 202 { 203 - struct radeon_bo *rbo = container_of(bo, struct radeon_bo, tbo); 203 + struct radeon_bo *rbo; 204 + static u32 placements = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM; 205 + 206 + if (!radeon_ttm_bo_is_radeon_bo(bo)) { 207 + placement->fpfn = 0; 208 + placement->lpfn = 0; 209 + placement->placement = &placements; 210 + placement->busy_placement = &placements; 211 + placement->num_placement = 1; 212 + placement->num_busy_placement = 1; 213 + return; 214 + } 215 + rbo = container_of(bo, struct radeon_bo, tbo); 204 216 switch (bo->mem.mem_type) { 205 217 case TTM_PL_VRAM: 206 218 radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_GTT);
+2
drivers/gpu/drm/radeon/rs400.c
··· 497 497 498 498 /* Initialize clocks */ 499 499 radeon_get_clock_info(rdev->ddev); 500 + /* Initialize power management */ 501 + radeon_pm_init(rdev); 500 502 /* Get vram informations */ 501 503 rs400_vram_info(rdev); 502 504 /* Initialize memory controller (also test AGP) */
+8 -6
drivers/gpu/drm/radeon/rv770.c
··· 892 892 } 893 893 rv770_gpu_init(rdev); 894 894 895 + if (!rdev->r600_blit.shader_obj) { 896 + r = r600_blit_init(rdev); 897 + if (r) { 898 + DRM_ERROR("radeon: failed blitter (%d).\n", r); 899 + return r; 900 + } 901 + } 902 + 895 903 r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false); 896 904 if (unlikely(r != 0)) 897 905 return r; ··· 1058 1050 r = r600_pcie_gart_init(rdev); 1059 1051 if (r) 1060 1052 return r; 1061 - 1062 - r = r600_blit_init(rdev); 1063 - if (r) { 1064 - DRM_ERROR("radeon: failed blitter (%d).\n", r); 1065 - return r; 1066 - } 1067 1053 1068 1054 rdev->accel_working = true; 1069 1055 r = rv770_startup(rdev);