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_video_caps_info
|
||||
amdgpu_read_mm_registers
|
||||
amdgpu_va_manager_alloc
|
||||
amdgpu_va_manager_init
|
||||
amdgpu_va_manager_deinit
|
||||
amdgpu_va_range_alloc
|
||||
amdgpu_va_range_free
|
||||
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;
|
||||
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
|
@ -1410,6 +1416,23 @@ int amdgpu_va_range_query(amdgpu_device_handle dev,
|
|||
uint64_t *start,
|
||||
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
|
||||
*
|
||||
|
|
|
@ -149,7 +149,6 @@ drm_public int amdgpu_device_initialize(int fd,
|
|||
int flag_auth = 0;
|
||||
int flag_authexist=0;
|
||||
uint32_t accel_working = 0;
|
||||
uint64_t start, max;
|
||||
|
||||
*device_handle = NULL;
|
||||
|
||||
|
@ -236,26 +235,11 @@ drm_public int amdgpu_device_initialize(int fd,
|
|||
goto cleanup;
|
||||
}
|
||||
|
||||
start = dev->dev_info.virtual_address_offset;
|
||||
max = MIN2(dev->dev_info.virtual_address_max, 0x100000000ULL);
|
||||
amdgpu_vamgr_init(&dev->va_mgr.vamgr_32, start, max,
|
||||
dev->dev_info.virtual_address_alignment);
|
||||
|
||||
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,
|
||||
amdgpu_va_manager_init(&dev->va_mgr,
|
||||
dev->dev_info.virtual_address_offset,
|
||||
dev->dev_info.virtual_address_max,
|
||||
dev->dev_info.high_va_offset,
|
||||
dev->dev_info.high_va_max,
|
||||
dev->dev_info.virtual_address_alignment);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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