qcacld-3.0: Add PLD APIs to get MSI information

These PLD APIs can be called to get PCIe MSI related information
from platform driver.

Change-Id: I2882f5c30d6f932c36af4503ac0bec9229ef35df
CRs-fixed: 1082183
This commit is contained in:
Yue Ma
2016-11-21 16:47:13 -08:00
committed by qcabuildsw
parent 3deb0a6711
commit fd418eabf6
3 changed files with 144 additions and 0 deletions

View File

@@ -356,6 +356,12 @@ int pld_athdiag_write(struct device *dev, uint32_t offset, uint32_t memtype,
void *pld_smmu_get_mapping(struct device *dev);
int pld_smmu_map(struct device *dev, phys_addr_t paddr,
uint32_t *iova_addr, size_t size);
int pld_get_user_msi_assignment(struct device *dev, char *user_name,
int *num_vectors, uint32_t *user_base_data,
uint32_t *base_vector);
int pld_get_msi_irq(struct device *dev, unsigned int vector);
void pld_get_msi_address(struct device *dev, uint32_t *msi_addr_low,
uint32_t *msi_addr_high);
unsigned int pld_socinfo_get_serial_number(struct device *dev);
uint8_t *pld_common_get_wlan_mac_address(struct device *dev, uint32_t *num);
int pld_is_qmi_disable(struct device *dev);

View File

@@ -1501,6 +1501,107 @@ int pld_smmu_map(struct device *dev, phys_addr_t paddr,
return ret;
}
/**
* pld_get_user_msi_assignment() - Get MSI assignment information
* @dev: device structure
* @user_name: name of the user who requests the MSI assignment
* @num_vectors: number of the MSI vectors assigned for the user
* @user_base_data: MSI base data assigned for the user, this equals to
* endpoint base data from config space plus base vector
* @base_vector: base MSI vector (offset) number assigned for the user
*
* Return: 0 for success
* Negative failure code for errors
*/
int pld_get_user_msi_assignment(struct device *dev, char *user_name,
int *num_vectors, uint32_t *user_base_data,
uint32_t *base_vector)
{
int ret = 0;
enum pld_bus_type type = pld_get_bus_type(dev);
switch (type) {
case PLD_BUS_TYPE_PCIE:
ret = pld_pcie_get_user_msi_assignment(dev, user_name,
num_vectors,
user_base_data,
base_vector);
break;
case PLD_BUS_TYPE_SNOC:
case PLD_BUS_TYPE_SDIO:
case PLD_BUS_TYPE_USB:
pr_err("Not supported on type %d\n", type);
ret = -ENODEV;
break;
default:
pr_err("Invalid device type %d\n", type);
ret = -EINVAL;
break;
}
return ret;
}
/**
* pld_get_msi_irq() - Get MSI IRQ number used for request_irq()
* @dev: device structure
* @vector: MSI vector (offset) number
*
* Return: Positive IRQ number for success
* Negative failure code for errors
*/
int pld_get_msi_irq(struct device *dev, unsigned int vector)
{
int ret = 0;
enum pld_bus_type type = pld_get_bus_type(dev);
switch (type) {
case PLD_BUS_TYPE_PCIE:
ret = pld_pcie_get_msi_irq(dev, vector);
break;
case PLD_BUS_TYPE_SNOC:
case PLD_BUS_TYPE_SDIO:
case PLD_BUS_TYPE_USB:
pr_err("Not supported on type %d\n", type);
ret = -ENODEV;
break;
default:
pr_err("Invalid device type %d\n", type);
ret = -EINVAL;
break;
}
return ret;
}
/**
* pld_get_msi_address() - Get the MSI address
* @dev: device structure
* @msi_addr_low: lower 32-bit of the address
* @msi_addr_high: higher 32-bit of the address
*
* Return: Void
*/
void pld_get_msi_address(struct device *dev, uint32_t *msi_addr_low,
uint32_t *msi_addr_high)
{
enum pld_bus_type type = pld_get_bus_type(dev);
switch (type) {
case PLD_BUS_TYPE_PCIE:
pld_pcie_get_msi_address(dev, msi_addr_low, msi_addr_high);
break;
case PLD_BUS_TYPE_SNOC:
case PLD_BUS_TYPE_SDIO:
case PLD_BUS_TYPE_USB:
pr_err("Not supported on type %d\n", type);
break;
default:
pr_err("Invalid device type %d\n", type);
break;
}
}
/**
* pld_socinfo_get_serial_number() - Get SOC serial number
* @dev: device

View File

@@ -234,6 +234,24 @@ static inline uint8_t *pld_pcie_get_wlan_mac_address(struct device *dev,
*num = 0;
return NULL;
}
static inline int pld_pcie_get_user_msi_assignment(struct device *dev,
char *user_name,
int *num_vectors,
uint32_t *user_base_data,
uint32_t *base_vector)
{
return 0;
}
static inline int pld_pcie_get_msi_irq(struct device *dev, unsigned int vector)
{
return 0;
}
static inline void pld_pcie_get_msi_address(struct device *dev,
uint32_t *msi_addr_low,
uint32_t *msi_addr_high)
{
return;
}
#else
int pld_pcie_get_fw_files_for_target(struct pld_fw_files *pfw_files,
u32 target_type, u32 target_version);
@@ -324,5 +342,24 @@ static inline uint8_t *pld_pcie_get_wlan_mac_address(struct device *dev,
{
return cnss_common_get_wlan_mac_address(dev, num);
}
static inline int pld_pcie_get_user_msi_assignment(struct device *dev,
char *user_name,
int *num_vectors,
uint32_t *user_base_data,
uint32_t *base_vector)
{
return cnss_get_user_msi_assignment(dev, user_name, num_vectors,
user_base_data, base_vector);
}
static inline int pld_pcie_get_msi_irq(struct device *dev, unsigned int vector)
{
return cnss_get_msi_irq(dev, vector);
}
static inline void pld_pcie_get_msi_address(struct device *dev,
uint32_t *msi_addr_low,
uint32_t *msi_addr_high)
{
cnss_get_msi_address(dev, msi_addr_low, msi_addr_high);
}
#endif
#endif