diff options
Diffstat (limited to 'drivers/platform/x86/intel/vsec.c')
| -rw-r--r-- | drivers/platform/x86/intel/vsec.c | 76 | 
1 files changed, 32 insertions, 44 deletions
diff --git a/drivers/platform/x86/intel/vsec.c b/drivers/platform/x86/intel/vsec.c index 13decf36c6de..c1f9e4471b28 100644 --- a/drivers/platform/x86/intel/vsec.c +++ b/drivers/platform/x86/intel/vsec.c @@ -67,14 +67,6 @@ enum intel_vsec_id {  	VSEC_ID_TPMI		= 66,  }; -static enum intel_vsec_id intel_vsec_allow_list[] = { -	VSEC_ID_TELEMETRY, -	VSEC_ID_WATCHER, -	VSEC_ID_CRASHLOG, -	VSEC_ID_SDSI, -	VSEC_ID_TPMI, -}; -  static const char *intel_vsec_name(enum intel_vsec_id id)  {  	switch (id) { @@ -98,26 +90,19 @@ static const char *intel_vsec_name(enum intel_vsec_id id)  	}  } -static bool intel_vsec_allowed(u16 id) -{ -	int i; - -	for (i = 0; i < ARRAY_SIZE(intel_vsec_allow_list); i++) -		if (intel_vsec_allow_list[i] == id) -			return true; - -	return false; -} - -static bool intel_vsec_disabled(u16 id, unsigned long quirks) +static bool intel_vsec_supported(u16 id, unsigned long caps)  {  	switch (id) { +	case VSEC_ID_TELEMETRY: +		return !!(caps & VSEC_CAP_TELEMETRY);  	case VSEC_ID_WATCHER: -		return !!(quirks & VSEC_QUIRK_NO_WATCHER); - +		return !!(caps & VSEC_CAP_WATCHER);  	case VSEC_ID_CRASHLOG: -		return !!(quirks & VSEC_QUIRK_NO_CRASHLOG); - +		return !!(caps & VSEC_CAP_CRASHLOG); +	case VSEC_ID_SDSI: +		return !!(caps & VSEC_CAP_SDSI); +	case VSEC_ID_TPMI: +		return !!(caps & VSEC_CAP_TPMI);  	default:  		return false;  	} @@ -154,6 +139,7 @@ int intel_vsec_add_aux(struct pci_dev *pdev, struct device *parent,  	ret = ida_alloc(intel_vsec_dev->ida, GFP_KERNEL);  	mutex_unlock(&vsec_ida_lock);  	if (ret < 0) { +		kfree(intel_vsec_dev->resource);  		kfree(intel_vsec_dev);  		return ret;  	} @@ -168,11 +154,7 @@ int intel_vsec_add_aux(struct pci_dev *pdev, struct device *parent,  	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); +		intel_vsec_dev_release(&auxdev->dev);  		return ret;  	} @@ -205,7 +187,7 @@ static int intel_vsec_add_dev(struct pci_dev *pdev, struct intel_vsec_header *he  	unsigned long quirks = info->quirks;  	int i; -	if (!intel_vsec_allowed(header->id) || intel_vsec_disabled(header->id, quirks)) +	if (!intel_vsec_supported(header->id, info->caps))  		return -EINVAL;  	if (!header->num_entries) { @@ -260,14 +242,14 @@ static int intel_vsec_add_dev(struct pci_dev *pdev, struct intel_vsec_header *he  static bool intel_vsec_walk_header(struct pci_dev *pdev,  				   struct intel_vsec_platform_info *info)  { -	struct intel_vsec_header **header = info->capabilities; +	struct intel_vsec_header **header = info->headers;  	bool have_devices = false;  	int ret;  	for ( ; *header; header++) {  		ret = intel_vsec_add_dev(pdev, *header, info);  		if (ret) -			dev_info(&pdev->dev, "Could not add device for DVSEC id %d\n", +			dev_info(&pdev->dev, "Could not add device for VSEC id %d\n",  				 (*header)->id);  		else  			have_devices = true; @@ -402,14 +384,8 @@ static int intel_vsec_pci_probe(struct pci_dev *pdev, const struct pci_device_id  	return 0;  } -/* TGL info */ -static const struct intel_vsec_platform_info tgl_info = { -	.quirks = VSEC_QUIRK_NO_WATCHER | VSEC_QUIRK_NO_CRASHLOG | -		  VSEC_QUIRK_TABLE_SHIFT | VSEC_QUIRK_EARLY_HW, -}; -  /* DG1 info */ -static struct intel_vsec_header dg1_telemetry = { +static struct intel_vsec_header dg1_header = {  	.length = 0x10,  	.id = 2,  	.num_entries = 1, @@ -418,19 +394,31 @@ static struct intel_vsec_header dg1_telemetry = {  	.offset = 0x466000,  }; -static struct intel_vsec_header *dg1_capabilities[] = { -	&dg1_telemetry, +static struct intel_vsec_header *dg1_headers[] = { +	&dg1_header,  	NULL  };  static const struct intel_vsec_platform_info dg1_info = { -	.capabilities = dg1_capabilities, +	.caps = VSEC_CAP_TELEMETRY, +	.headers = dg1_headers,  	.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, +	.caps = VSEC_CAP_TELEMETRY, +}; + +/* OOBMSM info */ +static const struct intel_vsec_platform_info oobmsm_info = { +	.caps = VSEC_CAP_TELEMETRY | VSEC_CAP_SDSI | VSEC_CAP_TPMI, +}; + +/* TGL info */ +static const struct intel_vsec_platform_info tgl_info = { +	.caps = VSEC_CAP_TELEMETRY, +	.quirks = VSEC_QUIRK_TABLE_SHIFT | VSEC_QUIRK_EARLY_HW,  };  #define PCI_DEVICE_ID_INTEL_VSEC_ADL		0x467d @@ -445,7 +433,7 @@ static const struct pci_device_id intel_vsec_pci_ids[] = {  	{ 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_OOBMSM, &oobmsm_info) },  	{ PCI_DEVICE_DATA(INTEL, VSEC_RPL, &tgl_info) },  	{ PCI_DEVICE_DATA(INTEL, VSEC_TGL, &tgl_info) },  	{ }  |