[PATCH] drm/radeon: add support for SET_APPEND_CNT packet3
Christian König
deathsimple at vodafone.de
Wed Apr 6 08:29:21 UTC 2016
Am 06.04.2016 um 08:03 schrieb Dave Airlie:
> From: Dave Airlie <airlied at redhat.com>
>
> This adds support to the command parser for the set append counter
> packet3, this is required to support atomic counters on
> evergreen/cayman GPUs.
>
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
> drivers/gpu/drm/radeon/evergreen_cs.c | 38 +++++++++++++++++++++++++++++++++++
> drivers/gpu/drm/radeon/evergreend.h | 20 ++++++++++++++++++
> drivers/gpu/drm/radeon/radeon_drv.c | 3 ++-
> 3 files changed, 60 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/radeon/evergreen_cs.c b/drivers/gpu/drm/radeon/evergreen_cs.c
> index 9e93205..1f618c5 100644
> --- a/drivers/gpu/drm/radeon/evergreen_cs.c
> +++ b/drivers/gpu/drm/radeon/evergreen_cs.c
> @@ -2608,6 +2608,44 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p,
> }
> }
> break;
> + case PACKET3_SET_APPEND_CNT:
> + {
> + uint32_t areg;
> + if (pkt->count != 2) {
> + DRM_ERROR("bad SET_APPEND_CNT (invalid count)\n");
> + return -EINVAL;
> + }
> +
> + areg = idx_value >> 16;
> + if (areg < 0x1cb || areg > 0x1cb + 8) {
Using defines instead of numbers would be nice to have here.
With or without this change the patch is Reviewed-by: Christian König
<christian.koenig at amd.com>
Regards,
Christian.
> + dev_warn(p->dev, "forbidden register for append cnt 0x%08x at %d\n",
> + areg, idx);
> + return -EINVAL;
> + }
> +
> + if ((idx_value & 0x3) == 0x3) { /* Read from memory address */
> + uint64_t offset;
> + uint32_t swap;
> + r = radeon_cs_packet_next_reloc(p, &reloc, 0);
> + if (r) {
> + DRM_ERROR("bad SET_APPEND_CNT (missing reloc)\n");
> + return -EINVAL;
> + }
> + offset = radeon_get_ib_value(p, idx+1);
> + swap = offset & 0x3;
> + offset &= ~0x3;
> +
> + offset += ((u64)(radeon_get_ib_value(p, idx+2) & 0xff)) << 32;
> +
> + offset += reloc->gpu_offset;
> + ib[idx+1] = (offset & 0xfffffffc) | swap;
> + ib[idx+2] = upper_32_bits(offset) & 0xff;
> + } else {
> + DRM_ERROR("bad SET_APPEND_CNT (unsupported operation)\n");
> + return -EINVAL;
> + }
> + break;
> + }
> case PACKET3_NOP:
> break;
> default:
> diff --git a/drivers/gpu/drm/radeon/evergreend.h b/drivers/gpu/drm/radeon/evergreend.h
> index 13b6029..2e2f740 100644
> --- a/drivers/gpu/drm/radeon/evergreend.h
> +++ b/drivers/gpu/drm/radeon/evergreend.h
> @@ -1689,6 +1689,26 @@
> #define PACKET3_SET_CONTEXT_REG_INDIRECT 0x73
> #define PACKET3_SET_RESOURCE_INDIRECT 0x74
> #define PACKET3_SET_APPEND_CNT 0x75
> +/* SET_APPEND_CNT - documentation
> + * 1. header
> + * 2. COMMAND
> + * 1:0 - SOURCE SEL
> + * 15:2 - Reserved
> + * 31:16 - WR_REG_OFFSET - context register to write source data to.
> + * (one of R_02872C_GDS_APPEND_COUNT_0-8)
> + * 3. CONTROL
> + * (for source == mem)
> + * 31:2 SRC_ADDRESS_LO
> + * 0:1 SWAP
> + * (for source == GDS)
> + * 31:0 GDS offset
> + * (for source == DATA)
> + * 31:0 DATA
> + * (for source == REG)
> + * 31:0 REG
> + * 4. SRC_ADDRESS_HI[7:0]
> + * kernel driver 2.44 only supports SRC == MEM.
> + */
>
> #define SQ_RESOURCE_CONSTANT_WORD7_0 0x3001c
> #define S__SQ_CONSTANT_TYPE(x) (((x) & 3) << 30)
> diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c
> index a4b5dbd..1f96b04 100644
> --- a/drivers/gpu/drm/radeon/radeon_drv.c
> +++ b/drivers/gpu/drm/radeon/radeon_drv.c
> @@ -93,9 +93,10 @@
> * 2.41.0 - evergreen/cayman: Add SET_BASE/DRAW_INDIRECT command parsing support
> * 2.42.0 - Add VCE/VUI (Video Usability Information) support
> * 2.43.0 - RADEON_INFO_GPU_RESET_COUNTER
> + * 2.44.0 - SET_APPEND_CNT packet3 support
> */
> #define KMS_DRIVER_MAJOR 2
> -#define KMS_DRIVER_MINOR 43
> +#define KMS_DRIVER_MINOR 44
> #define KMS_DRIVER_PATCHLEVEL 0
> int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags);
> int radeon_driver_unload_kms(struct drm_device *dev);
More information about the dri-devel
mailing list