Loading drivers/gpu/msm/adreno_cp_parser.c +8 −4 Original line number Diff line number Diff line Loading @@ -86,20 +86,23 @@ static void adreno_ib_merge_range(struct adreno_ib_object *ib_obj, * adreno_ib_check_overlap() - Checks if an address range overlap * @gpuaddr: The start address range to check for overlap * @size: Size of the address range * @type: The type of address range * @ib_obj_list: The list of address ranges to check for overlap * * Checks if an address range overlaps with a list of address ranges * Returns the entry from list which overlaps else NULL */ static struct adreno_ib_object *adreno_ib_check_overlap(unsigned int gpuaddr, unsigned int size, struct adreno_ib_object_list *ib_obj_list) unsigned int size, int type, struct adreno_ib_object_list *ib_obj_list) { struct adreno_ib_object *ib_obj; int i; for (i = 0; i < ib_obj_list->num_objs; i++) { ib_obj = &(ib_obj_list->obj_list[i]); if (kgsl_addr_range_overlap(ib_obj->gpuaddr, ib_obj->size, if ((type == ib_obj->snapshot_obj_type) && kgsl_addr_range_overlap(ib_obj->gpuaddr, ib_obj->size, gpuaddr, size)) /* regions overlap */ return ib_obj; Loading Loading @@ -145,7 +148,7 @@ static int adreno_ib_add_range(struct kgsl_device *device, gpuaddr = entry->memdesc.gpuaddr; } ib_obj = adreno_ib_check_overlap(gpuaddr, size, ib_obj_list); ib_obj = adreno_ib_check_overlap(gpuaddr, size, type, ib_obj_list); if (ib_obj) { adreno_ib_merge_range(ib_obj, gpuaddr, size); } else { Loading Loading @@ -714,7 +717,8 @@ static int adreno_ib_find_objs(struct kgsl_device *device, /* check that this IB is not already on list */ for (i = 0; i < ib_obj_list->num_objs; i++) { ib_obj = &(ib_obj_list->obj_list[i]); if ((ib_obj->gpuaddr <= gpuaddr) && if ((obj_type == ib_obj->snapshot_obj_type) && (ib_obj->gpuaddr <= gpuaddr) && ((ib_obj->gpuaddr + ib_obj->size) >= (gpuaddr + (dwords << 2)))) return 0; Loading drivers/gpu/msm/kgsl.h +4 −2 Original line number Diff line number Diff line Loading @@ -355,8 +355,10 @@ static inline bool kgsl_addr_range_overlap(unsigned int gpuaddr1, unsigned int size1, unsigned int gpuaddr2, unsigned int size2) { return !(((gpuaddr1 + size1) < gpuaddr2) || (gpuaddr1 > (gpuaddr2 + size2))); if ((size1 > (UINT_MAX - gpuaddr1)) || (size2 > (UINT_MAX - gpuaddr2))) return false; return !(((gpuaddr1 + size1) <= gpuaddr2) || (gpuaddr1 >= (gpuaddr2 + size2))); } #endif /* __KGSL_H */ Loading
drivers/gpu/msm/adreno_cp_parser.c +8 −4 Original line number Diff line number Diff line Loading @@ -86,20 +86,23 @@ static void adreno_ib_merge_range(struct adreno_ib_object *ib_obj, * adreno_ib_check_overlap() - Checks if an address range overlap * @gpuaddr: The start address range to check for overlap * @size: Size of the address range * @type: The type of address range * @ib_obj_list: The list of address ranges to check for overlap * * Checks if an address range overlaps with a list of address ranges * Returns the entry from list which overlaps else NULL */ static struct adreno_ib_object *adreno_ib_check_overlap(unsigned int gpuaddr, unsigned int size, struct adreno_ib_object_list *ib_obj_list) unsigned int size, int type, struct adreno_ib_object_list *ib_obj_list) { struct adreno_ib_object *ib_obj; int i; for (i = 0; i < ib_obj_list->num_objs; i++) { ib_obj = &(ib_obj_list->obj_list[i]); if (kgsl_addr_range_overlap(ib_obj->gpuaddr, ib_obj->size, if ((type == ib_obj->snapshot_obj_type) && kgsl_addr_range_overlap(ib_obj->gpuaddr, ib_obj->size, gpuaddr, size)) /* regions overlap */ return ib_obj; Loading Loading @@ -145,7 +148,7 @@ static int adreno_ib_add_range(struct kgsl_device *device, gpuaddr = entry->memdesc.gpuaddr; } ib_obj = adreno_ib_check_overlap(gpuaddr, size, ib_obj_list); ib_obj = adreno_ib_check_overlap(gpuaddr, size, type, ib_obj_list); if (ib_obj) { adreno_ib_merge_range(ib_obj, gpuaddr, size); } else { Loading Loading @@ -714,7 +717,8 @@ static int adreno_ib_find_objs(struct kgsl_device *device, /* check that this IB is not already on list */ for (i = 0; i < ib_obj_list->num_objs; i++) { ib_obj = &(ib_obj_list->obj_list[i]); if ((ib_obj->gpuaddr <= gpuaddr) && if ((obj_type == ib_obj->snapshot_obj_type) && (ib_obj->gpuaddr <= gpuaddr) && ((ib_obj->gpuaddr + ib_obj->size) >= (gpuaddr + (dwords << 2)))) return 0; Loading
drivers/gpu/msm/kgsl.h +4 −2 Original line number Diff line number Diff line Loading @@ -355,8 +355,10 @@ static inline bool kgsl_addr_range_overlap(unsigned int gpuaddr1, unsigned int size1, unsigned int gpuaddr2, unsigned int size2) { return !(((gpuaddr1 + size1) < gpuaddr2) || (gpuaddr1 > (gpuaddr2 + size2))); if ((size1 > (UINT_MAX - gpuaddr1)) || (size2 > (UINT_MAX - gpuaddr2))) return false; return !(((gpuaddr1 + size1) <= gpuaddr2) || (gpuaddr1 >= (gpuaddr2 + size2))); } #endif /* __KGSL_H */