diff options
| -rw-r--r-- | drivers/virt/acrn/acrn_drv.h | 4 | ||||
| -rw-r--r-- | drivers/virt/acrn/ioreq.c | 60 | 
2 files changed, 64 insertions, 0 deletions
| diff --git a/drivers/virt/acrn/acrn_drv.h b/drivers/virt/acrn/acrn_drv.h index 068f0be769f6..8a7d7721f505 100644 --- a/drivers/virt/acrn/acrn_drv.h +++ b/drivers/virt/acrn/acrn_drv.h @@ -197,6 +197,10 @@ struct acrn_ioreq_client *acrn_ioreq_client_create(struct acrn_vm *vm,  						   void *data, bool is_default,  						   const char *name);  void acrn_ioreq_client_destroy(struct acrn_ioreq_client *client); +int acrn_ioreq_range_add(struct acrn_ioreq_client *client, +			 u32 type, u64 start, u64 end); +void acrn_ioreq_range_del(struct acrn_ioreq_client *client, +			  u32 type, u64 start, u64 end);  int acrn_msi_inject(struct acrn_vm *vm, u64 msi_addr, u64 msi_data); diff --git a/drivers/virt/acrn/ioreq.c b/drivers/virt/acrn/ioreq.c index d19c05582d38..80b2e3f0e276 100644 --- a/drivers/virt/acrn/ioreq.c +++ b/drivers/virt/acrn/ioreq.c @@ -103,6 +103,66 @@ int acrn_ioreq_request_default_complete(struct acrn_vm *vm, u16 vcpu)  	return ret;  } +/** + * acrn_ioreq_range_add() - Add an iorange monitored by an ioreq client + * @client:	The ioreq client + * @type:	Type (ACRN_IOREQ_TYPE_MMIO or ACRN_IOREQ_TYPE_PORTIO) + * @start:	Start address of iorange + * @end:	End address of iorange + * + * Return: 0 on success, <0 on error + */ +int acrn_ioreq_range_add(struct acrn_ioreq_client *client, +			 u32 type, u64 start, u64 end) +{ +	struct acrn_ioreq_range *range; + +	if (end < start) { +		dev_err(acrn_dev.this_device, +			"Invalid IO range [0x%llx,0x%llx]\n", start, end); +		return -EINVAL; +	} + +	range = kzalloc(sizeof(*range), GFP_KERNEL); +	if (!range) +		return -ENOMEM; + +	range->type = type; +	range->start = start; +	range->end = end; + +	write_lock_bh(&client->range_lock); +	list_add(&range->list, &client->range_list); +	write_unlock_bh(&client->range_lock); + +	return 0; +} + +/** + * acrn_ioreq_range_del() - Del an iorange monitored by an ioreq client + * @client:	The ioreq client + * @type:	Type (ACRN_IOREQ_TYPE_MMIO or ACRN_IOREQ_TYPE_PORTIO) + * @start:	Start address of iorange + * @end:	End address of iorange + */ +void acrn_ioreq_range_del(struct acrn_ioreq_client *client, +			  u32 type, u64 start, u64 end) +{ +	struct acrn_ioreq_range *range; + +	write_lock_bh(&client->range_lock); +	list_for_each_entry(range, &client->range_list, list) { +		if (type == range->type && +		    start == range->start && +		    end == range->end) { +			list_del(&range->list); +			kfree(range); +			break; +		} +	} +	write_unlock_bh(&client->range_lock); +} +  /*   * ioreq_task() is the execution entity of handler thread of an I/O client.   * The handler callback of the I/O client is called within the handler thread. | 
