diff options
| author | Dave Airlie <airlied@redhat.com> | 2012-12-12 21:03:22 -0500 |
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2012-12-12 21:03:22 -0500 |
| commit | 9add1ac3dd256ad12e266f8403daf928be19953f (patch) | |
| tree | cdb9a18960aaf5e1bf851ff752b6e2d10d4fad7a | |
| parent | a636a9829175987e74ddd28a2e87ed17ff7adfdc (diff) | |
| parent | 86a1881d08f65a42c17071a59c0088dbe2870246 (diff) | |
Merge branch 'drm-next-3.8' of git://people.freedesktop.org/~agd5f/linux into drm-next
* 'drm-next-3.8' of git://people.freedesktop.org/~agd5f/linux:
drm/radeon: fix fence driver for dma ring when wb is disabled
drm/radeon/si: add VM CS checker support for CP DMA
drm/radeon/cayman: add VM CS checker support for CP DMA
drm/radeon: add support for CP DMA packet to evergreen CS checker
drm/radeon: add support for CP DMA packet to r6xx/r7xx CS checker
drm/radeon: add register headers for CP DMA on r6xx-SI
drm/radeon: improve mc_stop/mc_resume on r5xx-r7xx
drm/radeon: fix amd afusion gpu setup aka sumo v2
drm/radeon: do not move bo to different placement at each cs
| -rw-r--r-- | drivers/gpu/drm/radeon/evergreen.c | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/evergreen_cs.c | 136 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/evergreend.h | 49 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/r600.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/r600_cs.c | 72 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/r600_reg.h | 9 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/r600d.h | 32 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_asic.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_fence.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_object.c | 18 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/rv515.c | 122 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/si.c | 47 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/sid.h | 48 |
14 files changed, 516 insertions, 32 deletions
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index c66251e4a9b9..8dbc69a6e5bd 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
| @@ -1821,7 +1821,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
| 1821 | case CHIP_SUMO: | 1821 | case CHIP_SUMO: |
| 1822 | rdev->config.evergreen.num_ses = 1; | 1822 | rdev->config.evergreen.num_ses = 1; |
| 1823 | rdev->config.evergreen.max_pipes = 4; | 1823 | rdev->config.evergreen.max_pipes = 4; |
| 1824 | rdev->config.evergreen.max_tile_pipes = 2; | 1824 | rdev->config.evergreen.max_tile_pipes = 4; |
| 1825 | if (rdev->pdev->device == 0x9648) | 1825 | if (rdev->pdev->device == 0x9648) |
| 1826 | rdev->config.evergreen.max_simds = 3; | 1826 | rdev->config.evergreen.max_simds = 3; |
| 1827 | else if ((rdev->pdev->device == 0x9647) || | 1827 | else if ((rdev->pdev->device == 0x9647) || |
| @@ -1844,7 +1844,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
| 1844 | rdev->config.evergreen.sc_prim_fifo_size = 0x40; | 1844 | rdev->config.evergreen.sc_prim_fifo_size = 0x40; |
| 1845 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; | 1845 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; |
| 1846 | rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; | 1846 | rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; |
| 1847 | gb_addr_config = REDWOOD_GB_ADDR_CONFIG_GOLDEN; | 1847 | gb_addr_config = SUMO_GB_ADDR_CONFIG_GOLDEN; |
| 1848 | break; | 1848 | break; |
| 1849 | case CHIP_SUMO2: | 1849 | case CHIP_SUMO2: |
| 1850 | rdev->config.evergreen.num_ses = 1; | 1850 | rdev->config.evergreen.num_ses = 1; |
| @@ -1866,7 +1866,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
| 1866 | rdev->config.evergreen.sc_prim_fifo_size = 0x40; | 1866 | rdev->config.evergreen.sc_prim_fifo_size = 0x40; |
| 1867 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; | 1867 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; |
| 1868 | rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; | 1868 | rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; |
| 1869 | gb_addr_config = REDWOOD_GB_ADDR_CONFIG_GOLDEN; | 1869 | gb_addr_config = SUMO2_GB_ADDR_CONFIG_GOLDEN; |
| 1870 | break; | 1870 | break; |
| 1871 | case CHIP_BARTS: | 1871 | case CHIP_BARTS: |
| 1872 | rdev->config.evergreen.num_ses = 2; | 1872 | rdev->config.evergreen.num_ses = 2; |
| @@ -1914,7 +1914,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
| 1914 | break; | 1914 | break; |
| 1915 | case CHIP_CAICOS: | 1915 | case CHIP_CAICOS: |
| 1916 | rdev->config.evergreen.num_ses = 1; | 1916 | rdev->config.evergreen.num_ses = 1; |
| 1917 | rdev->config.evergreen.max_pipes = 4; | 1917 | rdev->config.evergreen.max_pipes = 2; |
| 1918 | rdev->config.evergreen.max_tile_pipes = 2; | 1918 | rdev->config.evergreen.max_tile_pipes = 2; |
| 1919 | rdev->config.evergreen.max_simds = 2; | 1919 | rdev->config.evergreen.max_simds = 2; |
| 1920 | rdev->config.evergreen.max_backends = 1 * rdev->config.evergreen.num_ses; | 1920 | rdev->config.evergreen.max_backends = 1 * rdev->config.evergreen.num_ses; |
diff --git a/drivers/gpu/drm/radeon/evergreen_cs.c b/drivers/gpu/drm/radeon/evergreen_cs.c index c042e497e450..62c227104781 100644 --- a/drivers/gpu/drm/radeon/evergreen_cs.c +++ b/drivers/gpu/drm/radeon/evergreen_cs.c | |||
| @@ -2232,6 +2232,95 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p, | |||
| 2232 | ib[idx+2] = upper_32_bits(offset) & 0xff; | 2232 | ib[idx+2] = upper_32_bits(offset) & 0xff; |
| 2233 | } | 2233 | } |
| 2234 | break; | 2234 | break; |
| 2235 | case PACKET3_CP_DMA: | ||
| 2236 | { | ||
| 2237 | u32 command, size, info; | ||
| 2238 | u64 offset, tmp; | ||
| 2239 | if (pkt->count != 4) { | ||
| 2240 | DRM_ERROR("bad CP DMA\n"); | ||
| 2241 | return -EINVAL; | ||
| 2242 | } | ||
| 2243 | command = radeon_get_ib_value(p, idx+4); | ||
| 2244 | size = command & 0x1fffff; | ||
| 2245 | info = radeon_get_ib_value(p, idx+1); | ||
| 2246 | if (command & PACKET3_CP_DMA_CMD_SAS) { | ||
| 2247 | /* src address space is register */ | ||
| 2248 | /* GDS is ok */ | ||
| 2249 | if (((info & 0x60000000) >> 29) != 1) { | ||
| 2250 | DRM_ERROR("CP DMA SAS not supported\n"); | ||
| 2251 | return -EINVAL; | ||
| 2252 | } | ||
| 2253 | } else { | ||
| 2254 | if (command & PACKET3_CP_DMA_CMD_SAIC) { | ||
| 2255 | DRM_ERROR("CP DMA SAIC only supported for registers\n"); | ||
| 2256 | return -EINVAL; | ||
| 2257 | } | ||
| 2258 | /* src address space is memory */ | ||
| 2259 | if (((info & 0x60000000) >> 29) == 0) { | ||
| 2260 | r = evergreen_cs_packet_next_reloc(p, &reloc); | ||
| 2261 | if (r) { | ||
| 2262 | DRM_ERROR("bad CP DMA SRC\n"); | ||
| 2263 | return -EINVAL; | ||
| 2264 | } | ||
| 2265 | |||
| 2266 | tmp = radeon_get_ib_value(p, idx) + | ||
| 2267 | ((u64)(radeon_get_ib_value(p, idx+1) & 0xff) << 32); | ||
| 2268 | |||
| 2269 | offset = reloc->lobj.gpu_offset + tmp; | ||
| 2270 | |||
| 2271 | if ((tmp + size) > radeon_bo_size(reloc->robj)) { | ||
| 2272 | dev_warn(p->dev, "CP DMA src buffer too small (%llu %lu)\n", | ||
| 2273 | tmp + size, radeon_bo_size(reloc->robj)); | ||
| 2274 | return -EINVAL; | ||
| 2275 | } | ||
| 2276 | |||
| 2277 | ib[idx] = offset; | ||
| 2278 | ib[idx+1] = (ib[idx+1] & 0xffffff00) | (upper_32_bits(offset) & 0xff); | ||
| 2279 | } else if (((info & 0x60000000) >> 29) != 2) { | ||
| 2280 | DRM_ERROR("bad CP DMA SRC_SEL\n"); | ||
| 2281 | return -EINVAL; | ||
| 2282 | } | ||
| 2283 | } | ||
| 2284 | if (command & PACKET3_CP_DMA_CMD_DAS) { | ||
| 2285 | /* dst address space is register */ | ||
| 2286 | /* GDS is ok */ | ||
| 2287 | if (((info & 0x00300000) >> 20) != 1) { | ||
| 2288 | DRM_ERROR("CP DMA DAS not supported\n"); | ||
| 2289 | return -EINVAL; | ||
| 2290 | } | ||
| 2291 | } else { | ||
| 2292 | /* dst address space is memory */ | ||
| 2293 | if (command & PACKET3_CP_DMA_CMD_DAIC) { | ||
| 2294 | DRM_ERROR("CP DMA DAIC only supported for registers\n"); | ||
| 2295 | return -EINVAL; | ||
| 2296 | } | ||
| 2297 | if (((info & 0x00300000) >> 20) == 0) { | ||
| 2298 | r = evergreen_cs_packet_next_reloc(p, &reloc); | ||
| 2299 | if (r) { | ||
| 2300 | DRM_ERROR("bad CP DMA DST\n"); | ||
| 2301 | return -EINVAL; | ||
| 2302 | } | ||
| 2303 | |||
| 2304 | tmp = radeon_get_ib_value(p, idx+2) + | ||
| 2305 | ((u64)(radeon_get_ib_value(p, idx+3) & 0xff) << 32); | ||
| 2306 | |||
| 2307 | offset = reloc->lobj.gpu_offset + tmp; | ||
| 2308 | |||
| 2309 | if ((tmp + size) > radeon_bo_size(reloc->robj)) { | ||
| 2310 | dev_warn(p->dev, "CP DMA dst buffer too small (%llu %lu)\n", | ||
| 2311 | tmp + size, radeon_bo_size(reloc->robj)); | ||
| 2312 | return -EINVAL; | ||
| 2313 | } | ||
| 2314 | |||
| 2315 | ib[idx+2] = offset; | ||
| 2316 | ib[idx+3] = upper_32_bits(offset) & 0xff; | ||
| 2317 | } else { | ||
| 2318 | DRM_ERROR("bad CP DMA DST_SEL\n"); | ||
| 2319 | return -EINVAL; | ||
| 2320 | } | ||
| 2321 | } | ||
| 2322 | break; | ||
| 2323 | } | ||
| 2235 | case PACKET3_SURFACE_SYNC: | 2324 | case PACKET3_SURFACE_SYNC: |
| 2236 | if (pkt->count != 3) { | 2325 | if (pkt->count != 3) { |
| 2237 | DRM_ERROR("bad SURFACE_SYNC\n"); | 2326 | DRM_ERROR("bad SURFACE_SYNC\n"); |
| @@ -2843,6 +2932,7 @@ static int evergreen_vm_packet3_check(struct radeon_device *rdev, | |||
| 2843 | u32 idx = pkt->idx + 1; | 2932 | u32 idx = pkt->idx + 1; |
| 2844 | u32 idx_value = ib[idx]; | 2933 | u32 idx_value = ib[idx]; |
| 2845 | u32 start_reg, end_reg, reg, i; | 2934 | u32 start_reg, end_reg, reg, i; |
| 2935 | u32 command, info; | ||
