Commit 85a129ca authored by Alex Deucher's avatar Alex Deucher

drm/radeon: add UVD->DPM helper function (v5)

Add a helper function for counting the number of open stream handles.

v2: fix copy-pasta in comments and whitespace error
v3: make function static since it's only used in radeon_uvd.c
at the moment
v4: make non-static again for future changes
v5: make static again for new rework of dpm uvd changes
Signed-off-by: default avatarChristian König <christian.koenig@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 4f862967
...@@ -1441,6 +1441,7 @@ struct radeon_uvd { ...@@ -1441,6 +1441,7 @@ struct radeon_uvd {
void *saved_bo; void *saved_bo;
atomic_t handles[RADEON_MAX_UVD_HANDLES]; atomic_t handles[RADEON_MAX_UVD_HANDLES];
struct drm_file *filp[RADEON_MAX_UVD_HANDLES]; struct drm_file *filp[RADEON_MAX_UVD_HANDLES];
unsigned img_size[RADEON_MAX_UVD_HANDLES];
struct delayed_work idle_work; struct delayed_work idle_work;
}; };
......
...@@ -147,6 +147,7 @@ int radeon_uvd_init(struct radeon_device *rdev) ...@@ -147,6 +147,7 @@ int radeon_uvd_init(struct radeon_device *rdev)
for (i = 0; i < RADEON_MAX_UVD_HANDLES; ++i) { for (i = 0; i < RADEON_MAX_UVD_HANDLES; ++i) {
atomic_set(&rdev->uvd.handles[i], 0); atomic_set(&rdev->uvd.handles[i], 0);
rdev->uvd.filp[i] = NULL; rdev->uvd.filp[i] = NULL;
rdev->uvd.img_size[i] = 0;
} }
return 0; return 0;
...@@ -347,6 +348,7 @@ static int radeon_uvd_cs_msg(struct radeon_cs_parser *p, struct radeon_bo *bo, ...@@ -347,6 +348,7 @@ static int radeon_uvd_cs_msg(struct radeon_cs_parser *p, struct radeon_bo *bo,
unsigned offset, unsigned buf_sizes[]) unsigned offset, unsigned buf_sizes[])
{ {
int32_t *msg, msg_type, handle; int32_t *msg, msg_type, handle;
unsigned img_size = 0;
void *ptr; void *ptr;
int i, r; int i, r;
...@@ -383,6 +385,8 @@ static int radeon_uvd_cs_msg(struct radeon_cs_parser *p, struct radeon_bo *bo, ...@@ -383,6 +385,8 @@ static int radeon_uvd_cs_msg(struct radeon_cs_parser *p, struct radeon_bo *bo,
if (msg_type == 1) { if (msg_type == 1) {
/* it's a decode msg, calc buffer sizes */ /* it's a decode msg, calc buffer sizes */
r = radeon_uvd_cs_msg_decode(msg, buf_sizes); r = radeon_uvd_cs_msg_decode(msg, buf_sizes);
/* calc image size (width * height) */
img_size = msg[6] * msg[7];
radeon_bo_kunmap(bo); radeon_bo_kunmap(bo);
if (r) if (r)
return r; return r;
...@@ -394,6 +398,8 @@ static int radeon_uvd_cs_msg(struct radeon_cs_parser *p, struct radeon_bo *bo, ...@@ -394,6 +398,8 @@ static int radeon_uvd_cs_msg(struct radeon_cs_parser *p, struct radeon_bo *bo,
radeon_bo_kunmap(bo); radeon_bo_kunmap(bo);
return 0; return 0;
} else { } else {
/* it's a create msg, calc image size (width * height) */
img_size = msg[7] * msg[8];
radeon_bo_kunmap(bo); radeon_bo_kunmap(bo);
if (msg_type != 0) { if (msg_type != 0) {
...@@ -414,6 +420,7 @@ static int radeon_uvd_cs_msg(struct radeon_cs_parser *p, struct radeon_bo *bo, ...@@ -414,6 +420,7 @@ static int radeon_uvd_cs_msg(struct radeon_cs_parser *p, struct radeon_bo *bo,
for (i = 0; i < RADEON_MAX_UVD_HANDLES; ++i) { for (i = 0; i < RADEON_MAX_UVD_HANDLES; ++i) {
if (!atomic_cmpxchg(&p->rdev->uvd.handles[i], 0, handle)) { if (!atomic_cmpxchg(&p->rdev->uvd.handles[i], 0, handle)) {
p->rdev->uvd.filp[i] = p->filp; p->rdev->uvd.filp[i] = p->filp;
p->rdev->uvd.img_size[i] = img_size;
return 0; return 0;
} }
} }
...@@ -733,6 +740,34 @@ int radeon_uvd_get_destroy_msg(struct radeon_device *rdev, int ring, ...@@ -733,6 +740,34 @@ int radeon_uvd_get_destroy_msg(struct radeon_device *rdev, int ring,
return radeon_uvd_send_msg(rdev, ring, bo, fence); return radeon_uvd_send_msg(rdev, ring, bo, fence);
} }
/**
* radeon_uvd_count_handles - count number of open streams
*
* @rdev: radeon_device pointer
* @sd: number of SD streams
* @hd: number of HD streams
*
* Count the number of open SD/HD streams as a hint for power mangement
*/
static void radeon_uvd_count_handles(struct radeon_device *rdev,
unsigned *sd, unsigned *hd)
{
unsigned i;
*sd = 0;
*hd = 0;
for (i = 0; i < RADEON_MAX_UVD_HANDLES; ++i) {
if (!atomic_read(&rdev->uvd.handles[i]))
continue;
if (rdev->uvd.img_size[i] >= 720*576)
++(*hd);
else
++(*sd);
}
}
static void radeon_uvd_idle_work_handler(struct work_struct *work) static void radeon_uvd_idle_work_handler(struct work_struct *work)
{ {
struct radeon_device *rdev = struct radeon_device *rdev =
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment