Skip to content

Commit e949de5

Browse files
Caterina Shabliajannau
authored andcommitted
drm/gpuvm: Add a flags field to drm_gpuva_op_map
drm_gpuva objects have a flags field. Currently, this can be managed by drivers out-of-band, without any special handling in drm_gpuvm. To be able to introduce flags that do affect the logic in the drm_gpuvm core, we need to plumb it through the map calls. This will allow the core to check the flags on map and alter the merge/split logic depending on the requested flags and the flags of the existing drm_gpuva ranges that are being split. Signed-off-by: Asahi Lina <lina+kernel@asahilina.net> Signed-off-by: Caterina Shablia <caterina.shablia@collabora.com>
1 parent f336a5d commit e949de5

2 files changed

Lines changed: 34 additions & 0 deletions

File tree

drivers/gpu/drm/drm_gpuvm.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2390,6 +2390,14 @@ op_unmap_cb(const struct drm_gpuvm_ops *fn, void *priv,
23902390
return fn->sm_step_unmap(&op, priv);
23912391
}
23922392

2393+
static bool can_merge_flags(struct drm_gpuvm *gpuvm, enum drm_gpuva_flags a,
2394+
enum drm_gpuva_flags b)
2395+
{
2396+
if (gpuvm->ops->sm_can_merge_flags)
2397+
return gpuvm->ops->sm_can_merge_flags(a, b);
2398+
return a == b;
2399+
}
2400+
23932401
static bool __can_merge(struct drm_gpuvm *gpuvm, const struct drm_gpuva_op_map *a,
23942402
const struct drm_gpuva_op_map *b)
23952403
{
@@ -2399,6 +2407,9 @@ static bool __can_merge(struct drm_gpuvm *gpuvm, const struct drm_gpuva_op_map *
23992407
if (a->gem.obj != b->gem.obj || !a->gem.obj)
24002408
return false;
24012409

2410+
if (can_merge_flags(gpuvm, a->flags, b->flags))
2411+
return false;
2412+
24022413
/* Order VAs for the rest of the checks. */
24032414
if (a->va.addr > b->va.addr)
24042415
swap(a, b);
@@ -2423,6 +2434,7 @@ static bool can_merge(struct drm_gpuvm *gpuvm, const struct drm_gpuva *a,
24232434
.va.range = a->va.range,
24242435
.gem.offset = a->gem.offset,
24252436
.gem.obj = a->gem.obj,
2437+
.flags = a->flags,
24262438
};
24272439

24282440
return __can_merge(gpuvm, &tmp, b);
@@ -2481,6 +2493,7 @@ __drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm,
24812493
.va.range = range - req_range,
24822494
.gem.obj = obj,
24832495
.gem.offset = offset + req_range,
2496+
.flags = va->flags,
24842497
};
24852498
struct drm_gpuva_op_unmap u = {
24862499
.va = va,
@@ -2502,6 +2515,7 @@ __drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm,
25022515
.va.range = ls_range,
25032516
.gem.obj = obj,
25042517
.gem.offset = offset,
2518+
.flags = va->flags,
25052519
};
25062520
struct drm_gpuva_op_unmap u = { .va = va };
25072521

@@ -2545,6 +2559,7 @@ __drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm,
25452559
.gem.obj = obj,
25462560
.gem.offset = offset + ls_range +
25472561
req_range,
2562+
.flags = va->flags,
25482563
};
25492564

25502565
ret = op_remap_cb(ops, priv, &p, &n, &u);
@@ -2582,6 +2597,7 @@ __drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm,
25822597
.va.range = end - req_end,
25832598
.gem.obj = obj,
25842599
.gem.offset = offset + req_end - addr,
2600+
.flags = va->flags,
25852601
};
25862602
struct drm_gpuva_op_unmap u = {
25872603
.va = va,
@@ -2633,6 +2649,7 @@ __drm_gpuvm_sm_unmap(struct drm_gpuvm *gpuvm,
26332649
prev.va.range = req_addr - addr;
26342650
prev.gem.obj = obj;
26352651
prev.gem.offset = offset;
2652+
prev.flags = va->flags;
26362653

26372654
prev_split = true;
26382655
}
@@ -2642,6 +2659,7 @@ __drm_gpuvm_sm_unmap(struct drm_gpuvm *gpuvm,
26422659
next.va.range = end - req_end;
26432660
next.gem.obj = obj;
26442661
next.gem.offset = offset + (req_end - addr);
2662+
next.flags = va->flags;
26452663

26462664
next_split = true;
26472665
}

include/drm/drm_gpuvm.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -887,6 +887,11 @@ struct drm_gpuva_op_map {
887887
*/
888888
struct drm_gem_object *obj;
889889
} gem;
890+
891+
/**
892+
* @flags: requested flags for the &drm_gpuva for this mapping
893+
*/
894+
enum drm_gpuva_flags flags;
890895
};
891896

892897
/**
@@ -1123,6 +1128,7 @@ void drm_gpuva_ops_free(struct drm_gpuvm *gpuvm,
11231128
static inline void drm_gpuva_init_from_op(struct drm_gpuva *va,
11241129
struct drm_gpuva_op_map *op)
11251130
{
1131+
va->flags = op->flags;
11261132
va->va.addr = op->va.addr;
11271133
va->va.range = op->va.range;
11281134
va->gem.obj = op->gem.obj;
@@ -1248,6 +1254,16 @@ struct drm_gpuvm_ops {
12481254
* used.
12491255
*/
12501256
int (*sm_step_unmap)(struct drm_gpuva_op *op, void *priv);
1257+
1258+
/**
1259+
* @sm_can_merge_flags: called during &drm_gpuvm_sm_map
1260+
*
1261+
* This callback is called to determine whether two va ranges can be merged,
1262+
* based on their flags.
1263+
*
1264+
* If NULL, va ranges can only be merged if their flags are equal.
1265+
*/
1266+
bool (*sm_can_merge_flags)(enum drm_gpuva_flags a, enum drm_gpuva_flags b);
12511267
};
12521268

12531269
int drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm, void *priv,

0 commit comments

Comments
 (0)