On Wed, Feb 22, 2012 at 5:28 PM,  <j.glisse at gmail.com> wrote:
> From: Jerome Glisse <jglisse at redhat.com>
>
> For 6xx+. ?Required for mesa to use htile support for HiZ/HiS.
> Userspace will check radeon version 2.14 with is bumped either
> by tiling patch or stream out patch. This patch only add support
> for htile relocation which should be enough for any userspace
> to implement the hyperz (using htile buffer) feature.
>
> v2: Jerome: Fix size checking for htile buffer.
>
> Signed-off-by: Pierre-Eric Pelloux-Prayer <pelloux at gmail.com>
> Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
> Signed-off-by: Jerome Glisse <jglisse at redhat.com>


Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

> ---
> ?drivers/gpu/drm/radeon/evergreen_cs.c ? ? | ? 78 ++++++-
> ?drivers/gpu/drm/radeon/evergreend.h ? ? ? | ? ?8 +
> ?drivers/gpu/drm/radeon/r600_cs.c ? ? ? ? ?| ?379 
> ++++++++++++++++++++---------
> ?drivers/gpu/drm/radeon/r600d.h ? ? ? ? ? ?| ? ?8 +
> ?drivers/gpu/drm/radeon/reg_srcs/cayman ? ?| ? ?1 -
> ?drivers/gpu/drm/radeon/reg_srcs/evergreen | ? ?1 -
> ?drivers/gpu/drm/radeon/reg_srcs/r600 ? ? ?| ? ?1 -
> ?7 files changed, 360 insertions(+), 116 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/evergreen_cs.c 
> b/drivers/gpu/drm/radeon/evergreen_cs.c
> index 2ed17f7..54a320a 100644
> --- a/drivers/gpu/drm/radeon/evergreen_cs.c
> +++ b/drivers/gpu/drm/radeon/evergreen_cs.c
> @@ -85,6 +85,9 @@ struct evergreen_cs_track {
> ? ? ? ?u32 ? ? ? ? ? ? ? ? ? ? db_s_write_offset;
> ? ? ? ?struct radeon_bo ? ? ? ?*db_s_read_bo;
> ? ? ? ?struct radeon_bo ? ? ? ?*db_s_write_bo;
> + ? ? ? u32 ? ? ? ? ? ? ? ? ? ? htile_offset;
> + ? ? ? u32 ? ? ? ? ? ? ? ? ? ? htile_surface;
> + ? ? ? struct radeon_bo ? ? ? ?*htile_bo;
> ?};
>
> ?static u32 evergreen_cs_get_aray_mode(u32 tiling_flags)
> @@ -155,6 +158,9 @@ static void evergreen_cs_track_init(struct 
> evergreen_cs_track *track)
> ? ? ? ?track->db_s_write_offset = 0xFFFFFFFF;
> ? ? ? ?track->db_s_read_bo = NULL;
> ? ? ? ?track->db_s_write_bo = NULL;
> + ? ? ? track->htile_bo = NULL;
> + ? ? ? track->htile_offset = 0xFFFFFFFF;
> + ? ? ? track->htile_surface = 0;
>
> ? ? ? ?for (i = 0; i < 4; i++) {
> ? ? ? ? ? ? ? ?track->vgt_strmout_size[i] = 0;
> @@ -627,6 +633,62 @@ static int evergreen_cs_track_validate_depth(struct 
> radeon_cs_parser *p)
> ? ? ? ? ? ? ? ?return -EINVAL;
> ? ? ? ?}
>
> + ? ? ? /* hyperz */
> + ? ? ? if (G_028040_TILE_SURFACE_ENABLE(track->db_z_info)) {
> + ? ? ? ? ? ? ? unsigned long size;
> + ? ? ? ? ? ? ? unsigned nbx, nby;
> +
> + ? ? ? ? ? ? ? if (track->htile_bo == NULL) {
> + ? ? ? ? ? ? ? ? ? ? ? dev_warn(p->dev, "%s:%d htile enabled without htile 
> surface 0x%08x\n",
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?__func__, __LINE__, track->db_z_info);
> + ? ? ? ? ? ? ? ? ? ? ? return -EINVAL;
> + ? ? ? ? ? ? ? }
> +
> + ? ? ? ? ? ? ? nbx = surf.nbx;
> + ? ? ? ? ? ? ? nby = surf.nby;
> + ? ? ? ? ? ? ? if (G_028ABC_LINEAR(track->htile_surface)) {
> + ? ? ? ? ? ? ? ? ? ? ? /* pitch must be 16 htiles aligned == 16 * 8 pixel 
> aligned */
> + ? ? ? ? ? ? ? ? ? ? ? nbx = round_up(nbx, 16 * 8);
> + ? ? ? ? ? ? ? ? ? ? ? /* height is npipes htiles aligned == npipes * 8 
> pixel aligned */
> + ? ? ? ? ? ? ? ? ? ? ? nby = round_up(nby, track->npipes * 8);
> + ? ? ? ? ? ? ? } else {
> + ? ? ? ? ? ? ? ? ? ? ? switch (track->npipes) {
> + ? ? ? ? ? ? ? ? ? ? ? case 8:
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nbx = round_up(nbx, 64 * 8);
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nby = round_up(nby, 64 * 8);
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
> + ? ? ? ? ? ? ? ? ? ? ? case 4:
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nbx = round_up(nbx, 64 * 8);
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nby = round_up(nby, 32 * 8);
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
> + ? ? ? ? ? ? ? ? ? ? ? case 2:
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nbx = round_up(nbx, 32 * 8);
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nby = round_up(nby, 32 * 8);
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
> + ? ? ? ? ? ? ? ? ? ? ? case 1:
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nbx = round_up(nbx, 32 * 8);
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nby = round_up(nby, 16 * 8);
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
> + ? ? ? ? ? ? ? ? ? ? ? default:
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? dev_warn(p->dev, "%s:%d invalid num pipes 
> %d\n",
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?__func__, __LINE__, track->npipes);
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return -EINVAL;
> + ? ? ? ? ? ? ? ? ? ? ? }
> + ? ? ? ? ? ? ? }
> + ? ? ? ? ? ? ? /* compute number of htile */
> + ? ? ? ? ? ? ? nbx = nbx / 8;
> + ? ? ? ? ? ? ? nby = nby / 8;
> + ? ? ? ? ? ? ? size = nbx * nby * 4;
> + ? ? ? ? ? ? ? size += track->htile_offset;
> +
> + ? ? ? ? ? ? ? if (size > radeon_bo_size(track->htile_bo)) {
> + ? ? ? ? ? ? ? ? ? ? ? dev_warn(p->dev, "%s:%d htile surface too small %ld 
> for %ld (%d %d)\n",
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?__func__, __LINE__, 
> radeon_bo_size(track->htile_bo),
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?size, nbx, nby);
> + ? ? ? ? ? ? ? ? ? ? ? return -EINVAL;
> + ? ? ? ? ? ? ? }
> + ? ? ? }
> +
> ? ? ? ?return 0;
> ?}
>
> @@ -1611,6 +1673,21 @@ static int evergreen_cs_check_reg(struct 
> radeon_cs_parser *p, u32 reg, u32 idx)
> ? ? ? ? ? ? ? ?track->cb_color_base_last[tmp] = ib[idx];
> ? ? ? ? ? ? ? ?track->cb_color_bo[tmp] = reloc->robj;
> ? ? ? ? ? ? ? ?break;
> + ? ? ? case DB_HTILE_DATA_BASE:
> + ? ? ? ? ? ? ? r = evergreen_cs_packet_next_reloc(p, &reloc);
> + ? ? ? ? ? ? ? if (r) {
> + ? ? ? ? ? ? ? ? ? ? ? dev_warn(p->dev, "bad SET_CONTEXT_REG "
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "0x%04X\n", reg);
> + ? ? ? ? ? ? ? ? ? ? ? return -EINVAL;
> + ? ? ? ? ? ? ? }
> + ? ? ? ? ? ? ? track->htile_offset = radeon_get_ib_value(p, idx);
> + ? ? ? ? ? ? ? ib[idx] += (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff);
> + ? ? ? ? ? ? ? track->htile_bo = reloc->robj;
> + ? ? ? ? ? ? ? break;
> + ? ? ? case DB_HTILE_SURFACE:
> + ? ? ? ? ? ? ? /* 8x8 only */
> + ? ? ? ? ? ? ? track->htile_surface = radeon_get_ib_value(p, idx);
> + ? ? ? ? ? ? ? break;
> ? ? ? ?case CB_IMMED0_BASE:
> ? ? ? ?case CB_IMMED1_BASE:
> ? ? ? ?case CB_IMMED2_BASE:
> @@ -1623,7 +1700,6 @@ static int evergreen_cs_check_reg(struct 
> radeon_cs_parser *p, u32 reg, u32 idx)
> ? ? ? ?case CB_IMMED9_BASE:
> ? ? ? ?case CB_IMMED10_BASE:
> ? ? ? ?case CB_IMMED11_BASE:
> - ? ? ? case DB_HTILE_DATA_BASE:
> ? ? ? ?case SQ_PGM_START_FS:
> ? ? ? ?case SQ_PGM_START_ES:
> ? ? ? ?case SQ_PGM_START_VS:
> diff --git a/drivers/gpu/drm/radeon/evergreend.h 
> b/drivers/gpu/drm/radeon/evergreend.h
> index eb5708c..b4eefc3 100644
> --- a/drivers/gpu/drm/radeon/evergreend.h
> +++ b/drivers/gpu/drm/radeon/evergreend.h
> @@ -991,6 +991,14 @@
> ?#define ? G_028008_SLICE_MAX(x) ? ? ? ? ? ? ? ? ? ? ? ?(((x) >> 13) & 0x7FF)
> ?#define ? C_028008_SLICE_MAX ? ? ? ? ? ? ? ? ? ? ? ? ? 0xFF001FFF
> ?#define DB_HTILE_DATA_BASE ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0x28014
> +#define DB_HTILE_SURFACE ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0x28abc
> +#define ? S_028ABC_HTILE_WIDTH(x) ? ? ? ? ? ? ? ? ? ? ?(((x) & 0x1) << 0)
> +#define ? G_028ABC_HTILE_WIDTH(x) ? ? ? ? ? ? ? ? ? ? ?(((x) >> 0) & 0x1)
> +#define ? C_028ABC_HTILE_WIDTH ? ? ? ? ? ? ? ? ? ? ? ? 0xFFFFFFFE
> +#define ? S_028ABC_HTILE_HEIGHT(x) ? ? ? ? ? ? ? ? ? ? ?(((x) & 0x1) << 1)
> +#define ? G_028ABC_HTILE_HEIGHT(x) ? ? ? ? ? ? ? ? ? ? ?(((x) >> 1) & 0x1)
> +#define ? C_028ABC_HTILE_HEIGHT ? ? ? ? ? ? ? ? ? ? ? ? 0xFFFFFFFD
> +#define ? G_028ABC_LINEAR(x) ? ? ? ? ? ? ? ? ? ? ? ? ? (((x) >> 2) & 0x1)
> ?#define DB_Z_INFO ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?0x28040
> ?# ? ? ? define Z_ARRAY_MODE(x) ? ? ? ? ? ? ? ? ? ? ? ? ?((x) << 4)
> ?# ? ? ? define DB_TILE_SPLIT(x) ? ? ? ? ? ? ? ? ? ? ? ? (((x) & 0x7) << 8)
> diff --git a/drivers/gpu/drm/radeon/r600_cs.c 
> b/drivers/gpu/drm/radeon/r600_cs.c
> index 5cbe948..b2556b5 100644
> --- a/drivers/gpu/drm/radeon/r600_cs.c
> +++ b/drivers/gpu/drm/radeon/r600_cs.c
> @@ -74,6 +74,9 @@ struct r600_cs_track {
> ? ? ? ?u32 ? ? ? ? ? ? ? ? ? ? db_offset;
> ? ? ? ?struct radeon_bo ? ? ? ?*db_bo;
> ? ? ? ?u64 ? ? ? ? ? ? ? ? ? ? db_bo_mc;
> + ? ? ? struct radeon_bo ? ? ? ?*htile_bo;
> + ? ? ? u64 ? ? ? ? ? ? ? ? ? ? htile_offset;
> + ? ? ? u32 ? ? ? ? ? ? ? ? ? ? htile_surface;
> ?};
>
> ?#define FMT_8_BIT(fmt, vc) ? [fmt] = { 1, 1, 1, vc, CHIP_R600 }
> @@ -315,6 +318,9 @@ static void r600_cs_track_init(struct r600_cs_track 
> *track)
> ? ? ? ?track->db_depth_size = 0xFFFFFFFF;
> ? ? ? ?track->db_depth_size_idx = 0;
> ? ? ? ?track->db_depth_control = 0xFFFFFFFF;
> + ? ? ? track->htile_bo = NULL;
> + ? ? ? track->htile_offset = 0xFFFFFFFF;
> + ? ? ? track->htile_surface = 0;
>
> ? ? ? ?for (i = 0; i < 4; i++) {
> ? ? ? ? ? ? ? ?track->vgt_strmout_size[i] = 0;
> @@ -447,12 +453,254 @@ static int r600_cs_track_validate_cb(struct 
> radeon_cs_parser *p, int i)
> ? ? ? ?return 0;
> ?}
>
> +static int r600_cs_track_validate_db(struct radeon_cs_parser *p)
> +{
> + ? ? ? struct r600_cs_track *track = p->track;
> + ? ? ? u32 nviews, bpe, ntiles, size, slice_tile_max, tmp;
> + ? ? ? u32 height_align, pitch_align, depth_align;
> + ? ? ? u32 pitch = 8192;
> + ? ? ? u32 height = 8192;
> + ? ? ? u64 base_offset, base_align;
> + ? ? ? struct array_mode_checker array_check;
> + ? ? ? int array_mode;
> + ? ? ? volatile u32 *ib = p->ib->ptr;
> +
> + ? ? ? if (track->db_bo == NULL) {
> + ? ? ? ? ? ? ? dev_warn(p->dev, "z/stencil with no depth buffer\n");
> + ? ? ? ? ? ? ? return -EINVAL;
> + ? ? ? }
> + ? ? ? switch (G_028010_FORMAT(track->db_depth_info)) {
> + ? ? ? case V_028010_DEPTH_16:
> + ? ? ? ? ? ? ? bpe = 2;
> + ? ? ? ? ? ? ? break;
> + ? ? ? case V_028010_DEPTH_X8_24:
> + ? ? ? case V_028010_DEPTH_8_24:
> + ? ? ? case V_028010_DEPTH_X8_24_FLOAT:
> + ? ? ? case V_028010_DEPTH_8_24_FLOAT:
> + ? ? ? case V_028010_DEPTH_32_FLOAT:
> + ? ? ? ? ? ? ? bpe = 4;
> + ? ? ? ? ? ? ? break;
> + ? ? ? case V_028010_DEPTH_X24_8_32_FLOAT:
> + ? ? ? ? ? ? ? bpe = 8;
> + ? ? ? ? ? ? ? break;
> + ? ? ? default:
> + ? ? ? ? ? ? ? dev_warn(p->dev, "z/stencil with invalid format %d\n", 
> G_028010_FORMAT(track->db_depth_info));
> + ? ? ? ? ? ? ? return -EINVAL;
> + ? ? ? }
> + ? ? ? if ((track->db_depth_size & 0xFFFFFC00) == 0xFFFFFC00) {
> + ? ? ? ? ? ? ? if (!track->db_depth_size_idx) {
> + ? ? ? ? ? ? ? ? ? ? ? dev_warn(p->dev, "z/stencil buffer size not set\n");
> + ? ? ? ? ? ? ? ? ? ? ? return -EINVAL;
> + ? ? ? ? ? ? ? }
> + ? ? ? ? ? ? ? tmp = radeon_bo_size(track->db_bo) - track->db_offset;
> + ? ? ? ? ? ? ? tmp = (tmp / bpe) >> 6;
> + ? ? ? ? ? ? ? if (!tmp) {
> + ? ? ? ? ? ? ? ? ? ? ? dev_warn(p->dev, "z/stencil buffer too small (0x%08X 
> %d %d %ld)\n",
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? track->db_depth_size, bpe, 
> track->db_offset,
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? radeon_bo_size(track->db_bo));
> + ? ? ? ? ? ? ? ? ? ? ? return -EINVAL;
> + ? ? ? ? ? ? ? }
> + ? ? ? ? ? ? ? ib[track->db_depth_size_idx] = S_028000_SLICE_TILE_MAX(tmp - 
> 1) | (track->db_depth_size & 0x3FF);
> + ? ? ? } else {
> + ? ? ? ? ? ? ? size = radeon_bo_size(track->db_bo);
> + ? ? ? ? ? ? ? /* pitch in pixels */
> + ? ? ? ? ? ? ? pitch = (G_028000_PITCH_TILE_MAX(track->db_depth_size) + 1) * 
> 8;
> + ? ? ? ? ? ? ? slice_tile_max = 
> G_028000_SLICE_TILE_MAX(track->db_depth_size) + 1;
> + ? ? ? ? ? ? ? slice_tile_max *= 64;
> + ? ? ? ? ? ? ? height = slice_tile_max / pitch;
> + ? ? ? ? ? ? ? if (height > 8192)
> + ? ? ? ? ? ? ? ? ? ? ? height = 8192;
> + ? ? ? ? ? ? ? base_offset = track->db_bo_mc + track->db_offset;
> + ? ? ? ? ? ? ? array_mode = G_028010_ARRAY_MODE(track->db_depth_info);
> + ? ? ? ? ? ? ? array_check.array_mode = array_mode;
> + ? ? ? ? ? ? ? array_check.group_size = track->group_size;
> + ? ? ? ? ? ? ? array_check.nbanks = track->nbanks;
> + ? ? ? ? ? ? ? array_check.npipes = track->npipes;
> + ? ? ? ? ? ? ? array_check.nsamples = track->nsamples;
> + ? ? ? ? ? ? ? array_check.blocksize = bpe;
> + ? ? ? ? ? ? ? if (r600_get_array_mode_alignment(&array_check,
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? &pitch_align, &height_align, 
> &depth_align, &base_align)) {
> + ? ? ? ? ? ? ? ? ? ? ? dev_warn(p->dev, "%s invalid tiling %d (0x%08X)\n", 
> __func__,
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 
> G_028010_ARRAY_MODE(track->db_depth_info),
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? track->db_depth_info);
> + ? ? ? ? ? ? ? ? ? ? ? return -EINVAL;
> + ? ? ? ? ? ? ? }
> + ? ? ? ? ? ? ? switch (array_mode) {
> + ? ? ? ? ? ? ? case V_028010_ARRAY_1D_TILED_THIN1:
> + ? ? ? ? ? ? ? ? ? ? ? /* don't break userspace */
> + ? ? ? ? ? ? ? ? ? ? ? height &= ~0x7;
> + ? ? ? ? ? ? ? ? ? ? ? break;
> + ? ? ? ? ? ? ? case V_028010_ARRAY_2D_TILED_THIN1:
> + ? ? ? ? ? ? ? ? ? ? ? break;
> + ? ? ? ? ? ? ? default:
> + ? ? ? ? ? ? ? ? ? ? ? dev_warn(p->dev, "%s invalid tiling %d (0x%08X)\n", 
> __func__,
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 
> G_028010_ARRAY_MODE(track->db_depth_info),
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? track->db_depth_info);
> + ? ? ? ? ? ? ? ? ? ? ? return -EINVAL;
> + ? ? ? ? ? ? ? }
> +
> + ? ? ? ? ? ? ? if (!IS_ALIGNED(pitch, pitch_align)) {
> + ? ? ? ? ? ? ? ? ? ? ? dev_warn(p->dev, "%s:%d db pitch (%d, 0x%x, %d) 
> invalid\n",
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? __func__, __LINE__, pitch, 
> pitch_align, array_mode);
> + ? ? ? ? ? ? ? ? ? ? ? return -EINVAL;
> + ? ? ? ? ? ? ? }
> + ? ? ? ? ? ? ? if (!IS_ALIGNED(height, height_align)) {
> + ? ? ? ? ? ? ? ? ? ? ? dev_warn(p->dev, "%s:%d db height (%d, 0x%x, %d) 
> invalid\n",
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? __func__, __LINE__, height, 
> height_align, array_mode);
> + ? ? ? ? ? ? ? ? ? ? ? return -EINVAL;
> + ? ? ? ? ? ? ? }
> + ? ? ? ? ? ? ? if (!IS_ALIGNED(base_offset, base_align)) {
> + ? ? ? ? ? ? ? ? ? ? ? dev_warn(p->dev, "%s offset 0x%llx, 0x%llx, %d not 
> aligned\n", __func__,
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? base_offset, base_align, array_mode);
> + ? ? ? ? ? ? ? ? ? ? ? return -EINVAL;
> + ? ? ? ? ? ? ? }
> +
> + ? ? ? ? ? ? ? ntiles = G_028000_SLICE_TILE_MAX(track->db_depth_size) + 1;
> + ? ? ? ? ? ? ? nviews = G_028004_SLICE_MAX(track->db_depth_view) + 1;
> + ? ? ? ? ? ? ? tmp = ntiles * bpe * 64 * nviews;
> + ? ? ? ? ? ? ? if ((tmp + track->db_offset) > radeon_bo_size(track->db_bo)) {
> + ? ? ? ? ? ? ? ? ? ? ? dev_warn(p->dev, "z/stencil buffer (%d) too small 
> (0x%08X %d %d %d -> %u have %lu)\n",
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? array_mode,
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? track->db_depth_size, ntiles, nviews, 
> bpe, tmp + track->db_offset,
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? radeon_bo_size(track->db_bo));
> + ? ? ? ? ? ? ? ? ? ? ? return -EINVAL;
> + ? ? ? ? ? ? ? }
> + ? ? ? }
> +
> + ? ? ? /* hyperz */
> + ? ? ? if (G_028010_TILE_SURFACE_ENABLE(track->db_depth_info)) {
> + ? ? ? ? ? ? ? unsigned long size;
> + ? ? ? ? ? ? ? unsigned nbx, nby;
> +
> + ? ? ? ? ? ? ? if (track->htile_bo == NULL) {
> + ? ? ? ? ? ? ? ? ? ? ? dev_warn(p->dev, "%s:%d htile enabled without htile 
> surface 0x%08x\n",
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?__func__, __LINE__, track->db_depth_info);
> + ? ? ? ? ? ? ? ? ? ? ? return -EINVAL;
> + ? ? ? ? ? ? ? }
> + ? ? ? ? ? ? ? if ((track->db_depth_size & 0xFFFFFC00) == 0xFFFFFC00) {
> + ? ? ? ? ? ? ? ? ? ? ? dev_warn(p->dev, "%s:%d htile can't be enabled with 
> bogus db_depth_size 0x%08x\n",
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?__func__, __LINE__, track->db_depth_size);
> + ? ? ? ? ? ? ? ? ? ? ? return -EINVAL;
> + ? ? ? ? ? ? ? }
> +
> + ? ? ? ? ? ? ? nbx = pitch;
> + ? ? ? ? ? ? ? nby = height;
> + ? ? ? ? ? ? ? if (G_028D24_LINEAR(track->htile_surface)) {
> + ? ? ? ? ? ? ? ? ? ? ? /* nbx must be 16 htiles aligned == 16 * 8 pixel 
> aligned */
> + ? ? ? ? ? ? ? ? ? ? ? nbx = round_up(nbx, 16 * 8);
> + ? ? ? ? ? ? ? ? ? ? ? /* nby is npipes htiles aligned == npipes * 8 pixel 
> aligned */
> + ? ? ? ? ? ? ? ? ? ? ? nby = round_up(nby, track->npipes * 8);
> + ? ? ? ? ? ? ? } else {
> + ? ? ? ? ? ? ? ? ? ? ? /* htile widht & nby (8 or 4) make 2 bits number */
> + ? ? ? ? ? ? ? ? ? ? ? tmp = track->htile_surface & 3;
> + ? ? ? ? ? ? ? ? ? ? ? /* align is htile align * 8, htile align vary 
> according to
> + ? ? ? ? ? ? ? ? ? ? ? ?* number of pipe and tile width and nby
> + ? ? ? ? ? ? ? ? ? ? ? ?*/
> + ? ? ? ? ? ? ? ? ? ? ? switch (track->npipes) {
> + ? ? ? ? ? ? ? ? ? ? ? case 8:
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? switch (tmp) {
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case 3: /* HTILE_WIDTH = 8 & HTILE_HEIGHT = 
> 8*/
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nbx = round_up(nbx, 64 * 8);
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nby = round_up(nby, 64 * 8);
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case 2: /* HTILE_WIDTH = 4 & HTILE_HEIGHT = 
> 8*/
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case 1: /* HTILE_WIDTH = 8 & HTILE_HEIGHT = 
> 4*/
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nbx = round_up(nbx, 64 * 8);
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nby = round_up(nby, 32 * 8);
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case 0: /* HTILE_WIDTH = 4 & HTILE_HEIGHT = 
> 4*/
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nbx = round_up(nbx, 32 * 8);
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nby = round_up(nby, 32 * 8);
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? default:
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return -EINVAL;
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
> + ? ? ? ? ? ? ? ? ? ? ? case 4:
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? switch (tmp) {
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case 3: /* HTILE_WIDTH = 8 & HTILE_HEIGHT = 
> 8*/
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nbx = round_up(nbx, 64 * 8);
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nby = round_up(nby, 32 * 8);
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case 2: /* HTILE_WIDTH = 4 & HTILE_HEIGHT = 
> 8*/
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case 1: /* HTILE_WIDTH = 8 & HTILE_HEIGHT = 
> 4*/
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nbx = round_up(nbx, 32 * 8);
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nby = round_up(nby, 32 * 8);
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case 0: /* HTILE_WIDTH = 4 & HTILE_HEIGHT = 
> 4*/
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nbx = round_up(nbx, 32 * 8);
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nby = round_up(nby, 16 * 8);
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? default:
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return -EINVAL;
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
> + ? ? ? ? ? ? ? ? ? ? ? case 2:
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? switch (tmp) {
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case 3: /* HTILE_WIDTH = 8 & HTILE_HEIGHT = 
> 8*/
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nbx = round_up(nbx, 32 * 8);
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nby = round_up(nby, 32 * 8);
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case 2: /* HTILE_WIDTH = 4 & HTILE_HEIGHT = 
> 8*/
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case 1: /* HTILE_WIDTH = 8 & HTILE_HEIGHT = 
> 4*/
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nbx = round_up(nbx, 32 * 8);
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nby = round_up(nby, 16 * 8);
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case 0: /* HTILE_WIDTH = 4 & HTILE_HEIGHT = 
> 4*/
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nbx = round_up(nbx, 16 * 8);
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nby = round_up(nby, 16 * 8);
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? default:
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return -EINVAL;
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
> + ? ? ? ? ? ? ? ? ? ? ? case 1:
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? switch (tmp) {
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case 3: /* HTILE_WIDTH = 8 & HTILE_HEIGHT = 
> 8*/
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nbx = round_up(nbx, 32 * 8);
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nby = round_up(nby, 16 * 8);
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case 2: /* HTILE_WIDTH = 4 & HTILE_HEIGHT = 
> 8*/
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case 1: /* HTILE_WIDTH = 8 & HTILE_HEIGHT = 
> 4*/
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nbx = round_up(nbx, 16 * 8);
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nby = round_up(nby, 16 * 8);
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case 0: /* HTILE_WIDTH = 4 & HTILE_HEIGHT = 
> 4*/
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nbx = round_up(nbx, 16 * 8);
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nby = round_up(nby, 8 * 8);
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? default:
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return -EINVAL;
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
> + ? ? ? ? ? ? ? ? ? ? ? default:
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? dev_warn(p->dev, "%s:%d invalid num pipes 
> %d\n",
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?__func__, __LINE__, track->npipes);
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return -EINVAL;
> + ? ? ? ? ? ? ? ? ? ? ? }
> + ? ? ? ? ? ? ? }
> + ? ? ? ? ? ? ? /* compute number of htile */
> + ? ? ? ? ? ? ? nbx = G_028D24_HTILE_WIDTH(track->htile_surface) ? nbx / 8 : 
> nbx / 4;
> + ? ? ? ? ? ? ? nby = G_028D24_HTILE_HEIGHT(track->htile_surface) ? nby / 8 : 
> nby / 4;
> + ? ? ? ? ? ? ? size = nbx * nby * 4;
> + ? ? ? ? ? ? ? size += track->htile_offset;
> +
> + ? ? ? ? ? ? ? if (size > radeon_bo_size(track->htile_bo)) {
> + ? ? ? ? ? ? ? ? ? ? ? dev_warn(p->dev, "%s:%d htile surface too small %ld 
> for %ld (%d %d)\n",
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?__func__, __LINE__, 
> radeon_bo_size(track->htile_bo),
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?size, nbx, nby);
> + ? ? ? ? ? ? ? ? ? ? ? return -EINVAL;
> + ? ? ? ? ? ? ? }
> + ? ? ? }
> +
> + ? ? ? return 0;
> +}
> +
> ?static int r600_cs_track_check(struct radeon_cs_parser *p)
> ?{
> ? ? ? ?struct r600_cs_track *track = p->track;
> ? ? ? ?u32 tmp;
> ? ? ? ?int r, i;
> - ? ? ? volatile u32 *ib = p->ib->ptr;
>
> ? ? ? ?/* on legacy kernel we don't perform advanced check */
> ? ? ? ?if (p->rdev == NULL)
> @@ -497,121 +745,15 @@ static int r600_cs_track_check(struct radeon_cs_parser 
> *p)
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?return r;
> ? ? ? ? ? ? ? ?}
> ? ? ? ?}
> +
> ? ? ? ?/* Check depth buffer */
> ? ? ? ?if (G_028800_STENCIL_ENABLE(track->db_depth_control) ||
> ? ? ? ? ? ? ? ?G_028800_Z_ENABLE(track->db_depth_control)) {
> - ? ? ? ? ? ? ? u32 nviews, bpe, ntiles, size, slice_tile_max;
> - ? ? ? ? ? ? ? u32 height, height_align, pitch, pitch_align, depth_align;
> - ? ? ? ? ? ? ? u64 base_offset, base_align;
> - ? ? ? ? ? ? ? struct array_mode_checker array_check;
> - ? ? ? ? ? ? ? int array_mode;
> -
> - ? ? ? ? ? ? ? if (track->db_bo == NULL) {
> - ? ? ? ? ? ? ? ? ? ? ? dev_warn(p->dev, "z/stencil with no depth buffer\n");
> - ? ? ? ? ? ? ? ? ? ? ? return -EINVAL;
> - ? ? ? ? ? ? ? }
> - ? ? ? ? ? ? ? if (G_028010_TILE_SURFACE_ENABLE(track->db_depth_info)) {
> - ? ? ? ? ? ? ? ? ? ? ? dev_warn(p->dev, "this kernel doesn't support 
> z/stencil htile\n");
> - ? ? ? ? ? ? ? ? ? ? ? return -EINVAL;
> - ? ? ? ? ? ? ? }
> - ? ? ? ? ? ? ? switch (G_028010_FORMAT(track->db_depth_info)) {
> - ? ? ? ? ? ? ? case V_028010_DEPTH_16:
> - ? ? ? ? ? ? ? ? ? ? ? bpe = 2;
> - ? ? ? ? ? ? ? ? ? ? ? break;
> - ? ? ? ? ? ? ? case V_028010_DEPTH_X8_24:
> - ? ? ? ? ? ? ? case V_028010_DEPTH_8_24:
> - ? ? ? ? ? ? ? case V_028010_DEPTH_X8_24_FLOAT:
> - ? ? ? ? ? ? ? case V_028010_DEPTH_8_24_FLOAT:
> - ? ? ? ? ? ? ? case V_028010_DEPTH_32_FLOAT:
> - ? ? ? ? ? ? ? ? ? ? ? bpe = 4;
> - ? ? ? ? ? ? ? ? ? ? ? break;
> - ? ? ? ? ? ? ? case V_028010_DEPTH_X24_8_32_FLOAT:
> - ? ? ? ? ? ? ? ? ? ? ? bpe = 8;
> - ? ? ? ? ? ? ? ? ? ? ? break;
> - ? ? ? ? ? ? ? default:
> - ? ? ? ? ? ? ? ? ? ? ? dev_warn(p->dev, "z/stencil with invalid format 
> %d\n", G_028010_FORMAT(track->db_depth_info));
> - ? ? ? ? ? ? ? ? ? ? ? return -EINVAL;
> - ? ? ? ? ? ? ? }
> - ? ? ? ? ? ? ? if ((track->db_depth_size & 0xFFFFFC00) == 0xFFFFFC00) {
> - ? ? ? ? ? ? ? ? ? ? ? if (!track->db_depth_size_idx) {
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? dev_warn(p->dev, "z/stencil buffer size not 
> set\n");
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return -EINVAL;
> - ? ? ? ? ? ? ? ? ? ? ? }
> - ? ? ? ? ? ? ? ? ? ? ? tmp = radeon_bo_size(track->db_bo) - track->db_offset;
> - ? ? ? ? ? ? ? ? ? ? ? tmp = (tmp / bpe) >> 6;
> - ? ? ? ? ? ? ? ? ? ? ? if (!tmp) {
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? dev_warn(p->dev, "z/stencil buffer too small 
> (0x%08X %d %d %ld)\n",
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? track->db_depth_size, bpe, 
> track->db_offset,
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? radeon_bo_size(track->db_bo));
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return -EINVAL;
> - ? ? ? ? ? ? ? ? ? ? ? }
> - ? ? ? ? ? ? ? ? ? ? ? ib[track->db_depth_size_idx] = 
> S_028000_SLICE_TILE_MAX(tmp - 1) | (track->db_depth_size & 0x3FF);
> - ? ? ? ? ? ? ? } else {
> - ? ? ? ? ? ? ? ? ? ? ? size = radeon_bo_size(track->db_bo);
> - ? ? ? ? ? ? ? ? ? ? ? /* pitch in pixels */
> - ? ? ? ? ? ? ? ? ? ? ? pitch = 
> (G_028000_PITCH_TILE_MAX(track->db_depth_size) + 1) * 8;
> - ? ? ? ? ? ? ? ? ? ? ? slice_tile_max = 
> G_028000_SLICE_TILE_MAX(track->db_depth_size) + 1;
> - ? ? ? ? ? ? ? ? ? ? ? slice_tile_max *= 64;
> - ? ? ? ? ? ? ? ? ? ? ? height = slice_tile_max / pitch;
> - ? ? ? ? ? ? ? ? ? ? ? if (height > 8192)
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? height = 8192;
> - ? ? ? ? ? ? ? ? ? ? ? base_offset = track->db_bo_mc + track->db_offset;
> - ? ? ? ? ? ? ? ? ? ? ? array_mode = 
> G_028010_ARRAY_MODE(track->db_depth_info);
> - ? ? ? ? ? ? ? ? ? ? ? array_check.array_mode = array_mode;
> - ? ? ? ? ? ? ? ? ? ? ? array_check.group_size = track->group_size;
> - ? ? ? ? ? ? ? ? ? ? ? array_check.nbanks = track->nbanks;
> - ? ? ? ? ? ? ? ? ? ? ? array_check.npipes = track->npipes;
> - ? ? ? ? ? ? ? ? ? ? ? array_check.nsamples = track->nsamples;
> - ? ? ? ? ? ? ? ? ? ? ? array_check.blocksize = bpe;
> - ? ? ? ? ? ? ? ? ? ? ? if (r600_get_array_mode_alignment(&array_check,
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? &pitch_align, 
> &height_align, &depth_align, &base_align)) {
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? dev_warn(p->dev, "%s invalid tiling %d 
> (0x%08X)\n", __func__,
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 
> ?G_028010_ARRAY_MODE(track->db_depth_info),
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?track->db_depth_info);
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return -EINVAL;
> - ? ? ? ? ? ? ? ? ? ? ? }
> - ? ? ? ? ? ? ? ? ? ? ? switch (array_mode) {
> - ? ? ? ? ? ? ? ? ? ? ? case V_028010_ARRAY_1D_TILED_THIN1:
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* don't break userspace */
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? height &= ~0x7;
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
> - ? ? ? ? ? ? ? ? ? ? ? case V_028010_ARRAY_2D_TILED_THIN1:
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
> - ? ? ? ? ? ? ? ? ? ? ? default:
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? dev_warn(p->dev, "%s invalid tiling %d 
> (0x%08X)\n", __func__,
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 
> ?G_028010_ARRAY_MODE(track->db_depth_info),
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?track->db_depth_info);
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return -EINVAL;
> - ? ? ? ? ? ? ? ? ? ? ? }
> -
> - ? ? ? ? ? ? ? ? ? ? ? if (!IS_ALIGNED(pitch, pitch_align)) {
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? dev_warn(p->dev, "%s:%d db pitch (%d, 0x%x, 
> %d) invalid\n",
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?__func__, __LINE__, pitch, 
> pitch_align, array_mode);
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return -EINVAL;
> - ? ? ? ? ? ? ? ? ? ? ? }
> - ? ? ? ? ? ? ? ? ? ? ? if (!IS_ALIGNED(height, height_align)) {
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? dev_warn(p->dev, "%s:%d db height (%d, 0x%x, 
> %d) invalid\n",
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?__func__, __LINE__, height, 
> height_align, array_mode);
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return -EINVAL;
> - ? ? ? ? ? ? ? ? ? ? ? }
> - ? ? ? ? ? ? ? ? ? ? ? if (!IS_ALIGNED(base_offset, base_align)) {
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? dev_warn(p->dev, "%s offset[%d] 0x%llx, 
> 0x%llx, %d not aligned\n", __func__, i,
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?base_offset, base_align, array_mode);
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return -EINVAL;
> - ? ? ? ? ? ? ? ? ? ? ? }
> -
> - ? ? ? ? ? ? ? ? ? ? ? ntiles = 
> G_028000_SLICE_TILE_MAX(track->db_depth_size) + 1;
> - ? ? ? ? ? ? ? ? ? ? ? nviews = G_028004_SLICE_MAX(track->db_depth_view) + 1;
> - ? ? ? ? ? ? ? ? ? ? ? tmp = ntiles * bpe * 64 * nviews;
> - ? ? ? ? ? ? ? ? ? ? ? if ((tmp + track->db_offset) > 
> radeon_bo_size(track->db_bo)) {
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? dev_warn(p->dev, "z/stencil buffer (%d) too 
> small (0x%08X %d %d %d -> %u have %lu)\n",
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?array_mode,
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?track->db_depth_size, ntiles, 
> nviews, bpe, tmp + track->db_offset,
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?radeon_bo_size(track->db_bo));
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return -EINVAL;
> - ? ? ? ? ? ? ? ? ? ? ? }
> - ? ? ? ? ? ? ? }
> + ? ? ? ? ? ? ? r = r600_cs_track_validate_db(p);
> + ? ? ? ? ? ? ? if (r)
> + ? ? ? ? ? ? ? ? ? ? ? return r;
> ? ? ? ?}
> +
> ? ? ? ?return 0;
> ?}
>
> @@ -1209,6 +1351,19 @@ static int r600_cs_check_reg(struct radeon_cs_parser 
> *p, u32 reg, u32 idx)
> ? ? ? ? ? ? ? ?track->db_bo_mc = reloc->lobj.gpu_offset;
> ? ? ? ? ? ? ? ?break;
> ? ? ? ?case DB_HTILE_DATA_BASE:
> + ? ? ? ? ? ? ? r = r600_cs_packet_next_reloc(p, &reloc);
> + ? ? ? ? ? ? ? if (r) {
> + ? ? ? ? ? ? ? ? ? ? ? dev_warn(p->dev, "bad SET_CONTEXT_REG "
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "0x%04X\n", reg);
> + ? ? ? ? ? ? ? ? ? ? ? return -EINVAL;
> + ? ? ? ? ? ? ? }
> + ? ? ? ? ? ? ? track->htile_offset = radeon_get_ib_value(p, idx) << 8;
> + ? ? ? ? ? ? ? ib[idx] += (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff);
> + ? ? ? ? ? ? ? track->htile_bo = reloc->robj;
> + ? ? ? ? ? ? ? break;
> + ? ? ? case DB_HTILE_SURFACE:
> + ? ? ? ? ? ? ? track->htile_surface = radeon_get_ib_value(p, idx);
> + ? ? ? ? ? ? ? break;
> ? ? ? ?case SQ_PGM_START_FS:
> ? ? ? ?case SQ_PGM_START_ES:
> ? ? ? ?case SQ_PGM_START_VS:
> diff --git a/drivers/gpu/drm/radeon/r600d.h b/drivers/gpu/drm/radeon/r600d.h
> index 2ba460b..9657f04 100644
> --- a/drivers/gpu/drm/radeon/r600d.h
> +++ b/drivers/gpu/drm/radeon/r600d.h
> @@ -195,6 +195,14 @@
> ?#define ? ? ? ? ? ? ? ?PREZ_MUST_WAIT_FOR_POSTZ_DONE ? ? ? ? ? ? ? ? ? (1 << 
> 31)
> ?#define ? ? ? ?DB_DEPTH_BASE ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0x2800C
> ?#define ? ? ? ?DB_HTILE_DATA_BASE ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?0x28014
> +#define ? ? ? ?DB_HTILE_SURFACE ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?0x28D24
> +#define ? S_028D24_HTILE_WIDTH(x) ? ? ? ? ? ? ? ? ? ? ?(((x) & 0x1) << 0)
> +#define ? G_028D24_HTILE_WIDTH(x) ? ? ? ? ? ? ? ? ? ? ?(((x) >> 0) & 0x1)
> +#define ? C_028D24_HTILE_WIDTH ? ? ? ? ? ? ? ? ? ? ? ? 0xFFFFFFFE
> +#define ? S_028D24_HTILE_HEIGHT(x) ? ? ? ? ? ? ? ? ? ? ?(((x) & 0x1) << 1)
> +#define ? G_028D24_HTILE_HEIGHT(x) ? ? ? ? ? ? ? ? ? ? ?(((x) >> 1) & 0x1)
> +#define ? C_028D24_HTILE_HEIGHT ? ? ? ? ? ? ? ? ? ? ? ? 0xFFFFFFFD
> +#define ? G_028D24_LINEAR(x) ? ? ? ? ? ? ? ? ? ? ? ? ? (((x) >> 2) & 0x1)
> ?#define ? ? ? ?DB_WATERMARKS ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0x9838
> ?#define ? ? ? ? ? ? ? ?DEPTH_FREE(x) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ((x) 
> << 0)
> ?#define ? ? ? ? ? ? ? ?DEPTH_FLUSH(x) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?((x) 
> << 5)
> diff --git a/drivers/gpu/drm/radeon/reg_srcs/cayman 
> b/drivers/gpu/drm/radeon/reg_srcs/cayman
> index 7b526d3..0446d4e 100644
> --- a/drivers/gpu/drm/radeon/reg_srcs/cayman
> +++ b/drivers/gpu/drm/radeon/reg_srcs/cayman
> @@ -510,7 +510,6 @@ cayman 0x9400
> ?0x00028AA8 IA_MULTI_VGT_PARAM
> ?0x00028AB4 VGT_REUSE_OFF
> ?0x00028AB8 VGT_VTX_CNT_EN
> -0x00028ABC DB_HTILE_SURFACE
> ?0x00028AC0 DB_SRESULTS_COMPARE_STATE0
> ?0x00028AC4 DB_SRESULTS_COMPARE_STATE1
> ?0x00028AC8 DB_PRELOAD_CONTROL
> diff --git a/drivers/gpu/drm/radeon/reg_srcs/evergreen 
> b/drivers/gpu/drm/radeon/reg_srcs/evergreen
> index 7f43394..d2eae01 100644
> --- a/drivers/gpu/drm/radeon/reg_srcs/evergreen
> +++ b/drivers/gpu/drm/radeon/reg_srcs/evergreen
> @@ -520,7 +520,6 @@ evergreen 0x9400
> ?0x00028AA4 VGT_INSTANCE_STEP_RATE_1
> ?0x00028AB4 VGT_REUSE_OFF
> ?0x00028AB8 VGT_VTX_CNT_EN
> -0x00028ABC DB_HTILE_SURFACE
> ?0x00028AC0 DB_SRESULTS_COMPARE_STATE0
> ?0x00028AC4 DB_SRESULTS_COMPARE_STATE1
> ?0x00028AC8 DB_PRELOAD_CONTROL
> diff --git a/drivers/gpu/drm/radeon/reg_srcs/r600 
> b/drivers/gpu/drm/radeon/reg_srcs/r600
> index 79d2455..0210665 100644
> --- a/drivers/gpu/drm/radeon/reg_srcs/r600
> +++ b/drivers/gpu/drm/radeon/reg_srcs/r600
> @@ -714,7 +714,6 @@ r600 0x9400
> ?0x0000A710 TD_VS_SAMPLER17_BORDER_RED
> ?0x00009508 TA_CNTL_AUX
> ?0x0002802C DB_DEPTH_CLEAR
> -0x00028D24 DB_HTILE_SURFACE
> ?0x00028D34 DB_PREFETCH_LIMIT
> ?0x00028D30 DB_PRELOAD_CONTROL
> ?0x00028D0C DB_RENDER_CONTROL
> --
> 1.7.7.1
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to