Skip to content

Commit a08eeb2

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 56cf531 commit a08eeb2

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
@@ -2172,6 +2172,14 @@ op_unmap_cb(const struct drm_gpuvm_ops *fn, void *priv,
21722172
return fn->sm_step_unmap(&op, priv);
21732173
}
21742174

2175+
static bool can_merge_flags(struct drm_gpuvm *gpuvm, enum drm_gpuva_flags a,
2176+
enum drm_gpuva_flags b)
2177+
{
2178+
if (gpuvm->ops->sm_can_merge_flags)
2179+
return gpuvm->ops->sm_can_merge_flags(a, b);
2180+
return a == b;
2181+
}
2182+
21752183
static bool __can_merge(struct drm_gpuvm *gpuvm, const struct drm_gpuva_op_map *a,
21762184
const struct drm_gpuva_op_map *b)
21772185
{
@@ -2181,6 +2189,9 @@ static bool __can_merge(struct drm_gpuvm *gpuvm, const struct drm_gpuva_op_map *
21812189
if (a->gem.obj != b->gem.obj || !a->gem.obj)
21822190
return false;
21832191

2192+
if (can_merge_flags(gpuvm, a->flags, b->flags))
2193+
return false;
2194+
21842195
/* Order VAs for the rest of the checks. */
21852196
if (a->va.addr > b->va.addr)
21862197
swap(a, b);
@@ -2205,6 +2216,7 @@ static bool can_merge(struct drm_gpuvm *gpuvm, const struct drm_gpuva *a,
22052216
.va.range = a->va.range,
22062217
.gem.offset = a->gem.offset,
22072218
.gem.obj = a->gem.obj,
2219+
.flags = a->flags,
22082220
};
22092221

22102222
return __can_merge(gpuvm, &tmp, b);
@@ -2263,6 +2275,7 @@ __drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm,
22632275
.va.range = range - req_range,
22642276
.gem.obj = obj,
22652277
.gem.offset = offset + req_range,
2278+
.flags = va->flags,
22662279
};
22672280
struct drm_gpuva_op_unmap u = {
22682281
.va = va,
@@ -2284,6 +2297,7 @@ __drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm,
22842297
.va.range = ls_range,
22852298
.gem.obj = obj,
22862299
.gem.offset = offset,
2300+
.flags = va->flags,
22872301
};
22882302
struct drm_gpuva_op_unmap u = { .va = va };
22892303

@@ -2327,6 +2341,7 @@ __drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm,
23272341
.gem.obj = obj,
23282342
.gem.offset = offset + ls_range +
23292343
req_range,
2344+
.flags = va->flags,
23302345
};
23312346

23322347
ret = op_remap_cb(ops, priv, &p, &n, &u);
@@ -2364,6 +2379,7 @@ __drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm,
23642379
.va.range = end - req_end,
23652380
.gem.obj = obj,
23662381
.gem.offset = offset + req_end - addr,
2382+
.flags = va->flags,
23672383
};
23682384
struct drm_gpuva_op_unmap u = {
23692385
.va = va,
@@ -2415,6 +2431,7 @@ __drm_gpuvm_sm_unmap(struct drm_gpuvm *gpuvm,
24152431
prev.va.range = req_addr - addr;
24162432
prev.gem.obj = obj;
24172433
prev.gem.offset = offset;
2434+
prev.flags = va->flags;
24182435

24192436
prev_split = true;
24202437
}
@@ -2424,6 +2441,7 @@ __drm_gpuvm_sm_unmap(struct drm_gpuvm *gpuvm,
24242441
next.va.range = end - req_end;
24252442
next.gem.obj = obj;
24262443
next.gem.offset = offset + (req_end - addr);
2444+
next.flags = va->flags;
24272445

24282446
next_split = true;
24292447
}

include/drm/drm_gpuvm.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -871,6 +871,11 @@ struct drm_gpuva_op_map {
871871
*/
872872
struct drm_gem_object *obj;
873873
} gem;
874+
875+
/**
876+
* @flags: requested flags for the &drm_gpuva for this mapping
877+
*/
878+
enum drm_gpuva_flags flags;
874879
};
875880

876881
/**
@@ -1107,6 +1112,7 @@ void drm_gpuva_ops_free(struct drm_gpuvm *gpuvm,
11071112
static inline void drm_gpuva_init_from_op(struct drm_gpuva *va,
11081113
struct drm_gpuva_op_map *op)
11091114
{
1115+
va->flags = op->flags;
11101116
va->va.addr = op->va.addr;
11111117
va->va.range = op->va.range;
11121118
va->gem.obj = op->gem.obj;
@@ -1232,6 +1238,16 @@ struct drm_gpuvm_ops {
12321238
* used.
12331239
*/
12341240
int (*sm_step_unmap)(struct drm_gpuva_op *op, void *priv);
1241+
1242+
/**
1243+
* @sm_can_merge_flags: called during &drm_gpuvm_sm_map
1244+
*
1245+
* This callback is called to determine whether two va ranges can be merged,
1246+
* based on their flags.
1247+
*
1248+
* If NULL, va ranges can only be merged if their flags are equal.
1249+
*/
1250+
bool (*sm_can_merge_flags)(enum drm_gpuva_flags a, enum drm_gpuva_flags b);
12351251
};
12361252

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

0 commit comments

Comments
 (0)