amdgpu: expose amdgpu_va_manager publicly
This will allow applications to use this feature without a device. The first use case will be native context: we want VA address to be managed by the guest (to avoid a round-trip to the host to only generate a VA) but the amdgpu_device only exist on the host. Reviewed-by: Marek Olšák <marek.olsak@amd.com>main
parent
4376848720
commit
96fe43a029
|
@ -71,6 +71,9 @@ amdgpu_query_info
|
||||||
amdgpu_query_sensor_info
|
amdgpu_query_sensor_info
|
||||||
amdgpu_query_video_caps_info
|
amdgpu_query_video_caps_info
|
||||||
amdgpu_read_mm_registers
|
amdgpu_read_mm_registers
|
||||||
|
amdgpu_va_manager_alloc
|
||||||
|
amdgpu_va_manager_init
|
||||||
|
amdgpu_va_manager_deinit
|
||||||
amdgpu_va_range_alloc
|
amdgpu_va_range_alloc
|
||||||
amdgpu_va_range_free
|
amdgpu_va_range_free
|
||||||
amdgpu_va_get_start_addr
|
amdgpu_va_get_start_addr
|
||||||
|
|
|
@ -138,6 +138,12 @@ typedef struct amdgpu_bo_list *amdgpu_bo_list_handle;
|
||||||
*/
|
*/
|
||||||
typedef struct amdgpu_va *amdgpu_va_handle;
|
typedef struct amdgpu_va *amdgpu_va_handle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define handle dealing with VA allocation. An amdgpu_device
|
||||||
|
* owns one of these, but they can also be used without a device.
|
||||||
|
*/
|
||||||
|
typedef struct amdgpu_va_manager *amdgpu_va_manager_handle;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Define handle for semaphore
|
* Define handle for semaphore
|
||||||
*/
|
*/
|
||||||
|
@ -1410,6 +1416,23 @@ int amdgpu_va_range_query(amdgpu_device_handle dev,
|
||||||
uint64_t *start,
|
uint64_t *start,
|
||||||
uint64_t *end);
|
uint64_t *end);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate a amdgpu_va_manager object.
|
||||||
|
* The returned object has be initialized with the amdgpu_va_manager_init
|
||||||
|
* before use.
|
||||||
|
* On release, amdgpu_va_manager_deinit needs to be called, then the memory
|
||||||
|
* can be released using free().
|
||||||
|
*/
|
||||||
|
amdgpu_va_manager_handle amdgpu_va_manager_alloc(void);
|
||||||
|
|
||||||
|
void amdgpu_va_manager_init(amdgpu_va_manager_handle va_mgr,
|
||||||
|
uint64_t low_va_offset, uint64_t low_va_max,
|
||||||
|
uint64_t high_va_offset, uint64_t high_va_max,
|
||||||
|
uint32_t virtual_address_alignment);
|
||||||
|
|
||||||
|
void amdgpu_va_manager_deinit(amdgpu_va_manager_handle va_mgr);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* VA mapping/unmapping for the buffer object
|
* VA mapping/unmapping for the buffer object
|
||||||
*
|
*
|
||||||
|
|
|
@ -149,7 +149,6 @@ drm_public int amdgpu_device_initialize(int fd,
|
||||||
int flag_auth = 0;
|
int flag_auth = 0;
|
||||||
int flag_authexist=0;
|
int flag_authexist=0;
|
||||||
uint32_t accel_working = 0;
|
uint32_t accel_working = 0;
|
||||||
uint64_t start, max;
|
|
||||||
|
|
||||||
*device_handle = NULL;
|
*device_handle = NULL;
|
||||||
|
|
||||||
|
@ -236,26 +235,11 @@ drm_public int amdgpu_device_initialize(int fd,
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
start = dev->dev_info.virtual_address_offset;
|
amdgpu_va_manager_init(&dev->va_mgr,
|
||||||
max = MIN2(dev->dev_info.virtual_address_max, 0x100000000ULL);
|
dev->dev_info.virtual_address_offset,
|
||||||
amdgpu_vamgr_init(&dev->va_mgr.vamgr_32, start, max,
|
dev->dev_info.virtual_address_max,
|
||||||
dev->dev_info.virtual_address_alignment);
|
dev->dev_info.high_va_offset,
|
||||||
|
dev->dev_info.high_va_max,
|
||||||
start = max;
|
|
||||||
max = MAX2(dev->dev_info.virtual_address_max, 0x100000000ULL);
|
|
||||||
amdgpu_vamgr_init(&dev->va_mgr.vamgr_low, start, max,
|
|
||||||
dev->dev_info.virtual_address_alignment);
|
|
||||||
|
|
||||||
start = dev->dev_info.high_va_offset;
|
|
||||||
max = MIN2(dev->dev_info.high_va_max, (start & ~0xffffffffULL) +
|
|
||||||
0x100000000ULL);
|
|
||||||
amdgpu_vamgr_init(&dev->va_mgr.vamgr_high_32, start, max,
|
|
||||||
dev->dev_info.virtual_address_alignment);
|
|
||||||
|
|
||||||
start = max;
|
|
||||||
max = MAX2(dev->dev_info.high_va_max, (start & ~0xffffffffULL) +
|
|
||||||
0x100000000ULL);
|
|
||||||
amdgpu_vamgr_init(&dev->va_mgr.vamgr_high, start, max,
|
|
||||||
dev->dev_info.virtual_address_alignment);
|
dev->dev_info.virtual_address_alignment);
|
||||||
|
|
||||||
amdgpu_parse_asic_ids(dev);
|
amdgpu_parse_asic_ids(dev);
|
||||||
|
|
|
@ -300,3 +300,45 @@ drm_public uint64_t amdgpu_va_get_start_addr(amdgpu_va_handle va_handle)
|
||||||
{
|
{
|
||||||
return va_handle->address;
|
return va_handle->address;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
drm_public amdgpu_va_manager_handle amdgpu_va_manager_alloc(void)
|
||||||
|
{
|
||||||
|
amdgpu_va_manager_handle r = calloc(1, sizeof(struct amdgpu_va_manager));
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
drm_public void amdgpu_va_manager_init(struct amdgpu_va_manager *va_mgr,
|
||||||
|
uint64_t low_va_offset, uint64_t low_va_max,
|
||||||
|
uint64_t high_va_offset, uint64_t high_va_max,
|
||||||
|
uint32_t virtual_address_alignment)
|
||||||
|
{
|
||||||
|
uint64_t start, max;
|
||||||
|
|
||||||
|
start = low_va_offset;
|
||||||
|
max = MIN2(low_va_max, 0x100000000ULL);
|
||||||
|
amdgpu_vamgr_init(&va_mgr->vamgr_32, start, max,
|
||||||
|
virtual_address_alignment);
|
||||||
|
|
||||||
|
start = max;
|
||||||
|
max = MAX2(low_va_max, 0x100000000ULL);
|
||||||
|
amdgpu_vamgr_init(&va_mgr->vamgr_low, start, max,
|
||||||
|
virtual_address_alignment);
|
||||||
|
|
||||||
|
start = high_va_offset;
|
||||||
|
max = MIN2(high_va_max, (start & ~0xffffffffULL) + 0x100000000ULL);
|
||||||
|
amdgpu_vamgr_init(&va_mgr->vamgr_high_32, start, max,
|
||||||
|
virtual_address_alignment);
|
||||||
|
|
||||||
|
start = max;
|
||||||
|
max = MAX2(high_va_max, (start & ~0xffffffffULL) + 0x100000000ULL);
|
||||||
|
amdgpu_vamgr_init(&va_mgr->vamgr_high, start, max,
|
||||||
|
virtual_address_alignment);
|
||||||
|
}
|
||||||
|
|
||||||
|
drm_public void amdgpu_va_manager_deinit(struct amdgpu_va_manager *va_mgr)
|
||||||
|
{
|
||||||
|
amdgpu_vamgr_deinit(&va_mgr->vamgr_32);
|
||||||
|
amdgpu_vamgr_deinit(&va_mgr->vamgr_low);
|
||||||
|
amdgpu_vamgr_deinit(&va_mgr->vamgr_high_32);
|
||||||
|
amdgpu_vamgr_deinit(&va_mgr->vamgr_high);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue