diff options
Diffstat (limited to 'drivers/platform/x86/intel/vsec.c')
| -rw-r--r-- | drivers/platform/x86/intel/vsec.c | 39 | 
1 files changed, 34 insertions, 5 deletions
diff --git a/drivers/platform/x86/intel/vsec.c b/drivers/platform/x86/intel/vsec.c index bb81b8b1f7e9..13decf36c6de 100644 --- a/drivers/platform/x86/intel/vsec.c +++ b/drivers/platform/x86/intel/vsec.c @@ -64,6 +64,7 @@ enum intel_vsec_id {  	VSEC_ID_WATCHER		= 3,  	VSEC_ID_CRASHLOG	= 4,  	VSEC_ID_SDSI		= 65, +	VSEC_ID_TPMI		= 66,  };  static enum intel_vsec_id intel_vsec_allow_list[] = { @@ -71,6 +72,7 @@ static enum intel_vsec_id intel_vsec_allow_list[] = {  	VSEC_ID_WATCHER,  	VSEC_ID_CRASHLOG,  	VSEC_ID_SDSI, +	VSEC_ID_TPMI,  };  static const char *intel_vsec_name(enum intel_vsec_id id) @@ -88,6 +90,9 @@ static const char *intel_vsec_name(enum intel_vsec_id id)  	case VSEC_ID_SDSI:  		return "sdsi"; +	case VSEC_ID_TPMI: +		return "tpmi"; +  	default:  		return NULL;  	} @@ -124,35 +129,48 @@ static void intel_vsec_remove_aux(void *data)  	auxiliary_device_uninit(data);  } +static DEFINE_MUTEX(vsec_ida_lock); +  static void intel_vsec_dev_release(struct device *dev)  {  	struct intel_vsec_device *intel_vsec_dev = dev_to_ivdev(dev); +	mutex_lock(&vsec_ida_lock);  	ida_free(intel_vsec_dev->ida, intel_vsec_dev->auxdev.id); +	mutex_unlock(&vsec_ida_lock); +  	kfree(intel_vsec_dev->resource);  	kfree(intel_vsec_dev);  } -static int intel_vsec_add_aux(struct pci_dev *pdev, struct intel_vsec_device *intel_vsec_dev, -			      const char *name) +int intel_vsec_add_aux(struct pci_dev *pdev, struct device *parent, +		       struct intel_vsec_device *intel_vsec_dev, +		       const char *name)  {  	struct auxiliary_device *auxdev = &intel_vsec_dev->auxdev;  	int ret, id; +	mutex_lock(&vsec_ida_lock);  	ret = ida_alloc(intel_vsec_dev->ida, GFP_KERNEL); +	mutex_unlock(&vsec_ida_lock);  	if (ret < 0) {  		kfree(intel_vsec_dev);  		return ret;  	} +	if (!parent) +		parent = &pdev->dev; +  	auxdev->id = ret;  	auxdev->name = name; -	auxdev->dev.parent = &pdev->dev; +	auxdev->dev.parent = parent;  	auxdev->dev.release = intel_vsec_dev_release;  	ret = auxiliary_device_init(auxdev);  	if (ret < 0) { +		mutex_lock(&vsec_ida_lock);  		ida_free(intel_vsec_dev->ida, auxdev->id); +		mutex_unlock(&vsec_ida_lock);  		kfree(intel_vsec_dev->resource);  		kfree(intel_vsec_dev);  		return ret; @@ -164,7 +182,7 @@ static int intel_vsec_add_aux(struct pci_dev *pdev, struct intel_vsec_device *in  		return ret;  	} -	ret = devm_add_action_or_reset(&pdev->dev, intel_vsec_remove_aux, +	ret = devm_add_action_or_reset(parent, intel_vsec_remove_aux,  				       auxdev);  	if (ret < 0)  		return ret; @@ -177,6 +195,7 @@ static int intel_vsec_add_aux(struct pci_dev *pdev, struct intel_vsec_device *in  	return 0;  } +EXPORT_SYMBOL_NS_GPL(intel_vsec_add_aux, INTEL_VSEC);  static int intel_vsec_add_dev(struct pci_dev *pdev, struct intel_vsec_header *header,  			      struct intel_vsec_platform_info *info) @@ -234,7 +253,8 @@ static int intel_vsec_add_dev(struct pci_dev *pdev, struct intel_vsec_header *he  	else  		intel_vsec_dev->ida = &intel_vsec_ida; -	return intel_vsec_add_aux(pdev, intel_vsec_dev, intel_vsec_name(header->id)); +	return intel_vsec_add_aux(pdev, NULL, intel_vsec_dev, +				  intel_vsec_name(header->id));  }  static bool intel_vsec_walk_header(struct pci_dev *pdev, @@ -408,14 +428,23 @@ static const struct intel_vsec_platform_info dg1_info = {  	.quirks = VSEC_QUIRK_NO_DVSEC | VSEC_QUIRK_EARLY_HW,  }; +/* MTL info */ +static const struct intel_vsec_platform_info mtl_info = { +	.quirks = VSEC_QUIRK_NO_WATCHER | VSEC_QUIRK_NO_CRASHLOG, +}; +  #define PCI_DEVICE_ID_INTEL_VSEC_ADL		0x467d  #define PCI_DEVICE_ID_INTEL_VSEC_DG1		0x490e +#define PCI_DEVICE_ID_INTEL_VSEC_MTL_M		0x7d0d +#define PCI_DEVICE_ID_INTEL_VSEC_MTL_S		0xad0d  #define PCI_DEVICE_ID_INTEL_VSEC_OOBMSM		0x09a7  #define PCI_DEVICE_ID_INTEL_VSEC_RPL		0xa77d  #define PCI_DEVICE_ID_INTEL_VSEC_TGL		0x9a0d  static const struct pci_device_id intel_vsec_pci_ids[] = {  	{ PCI_DEVICE_DATA(INTEL, VSEC_ADL, &tgl_info) },  	{ PCI_DEVICE_DATA(INTEL, VSEC_DG1, &dg1_info) }, +	{ PCI_DEVICE_DATA(INTEL, VSEC_MTL_M, &mtl_info) }, +	{ PCI_DEVICE_DATA(INTEL, VSEC_MTL_S, &mtl_info) },  	{ PCI_DEVICE_DATA(INTEL, VSEC_OOBMSM, &(struct intel_vsec_platform_info) {}) },  	{ PCI_DEVICE_DATA(INTEL, VSEC_RPL, &tgl_info) },  	{ PCI_DEVICE_DATA(INTEL, VSEC_TGL, &tgl_info) },  |