Unverified Commit 01d2adcf authored by Suma Hegde's avatar Suma Hegde Committed by Ilpo Järvinen
Browse files

platform/x86/amd/hsmp: create plat specific struct



Having a separate platform device structure helps in future, to
contain platform specific variables and other data.

Also, define macros for dev nodes

Signed-off-by: default avatarSuma Hegde <suma.hegde@amd.com>
Reviewed-by: default avatarNaveen Krishna Chatradhi <nchatrad@amd.com>
Link: https://lore.kernel.org/r/20231010120310.3464066-1-suma.hegde@amd.com


Reviewed-by: default avatarIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: default avatarIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
parent 8abba089
Loading
Loading
Loading
Loading
+38 −23
Original line number Diff line number Diff line
@@ -47,9 +47,22 @@
#define HSMP_INDEX_REG		0xc4
#define HSMP_DATA_REG		0xc8

static struct semaphore *hsmp_sem;
#define HSMP_CDEV_NAME		"hsmp_cdev"
#define HSMP_DEVNODE_NAME	"hsmp"

static struct miscdevice hsmp_device;
struct hsmp_socket {
	struct semaphore hsmp_sem;
	u16 sock_ind;
};

struct hsmp_plat_device {
	struct miscdevice hsmp_device;
	struct hsmp_socket *sock;
	struct device *dev;
	u16 num_sockets;
};

static struct hsmp_plat_device plat_dev;

static int amd_hsmp_rdwr(struct pci_dev *root, u32 address,
			 u32 *value, bool write)
@@ -188,6 +201,7 @@ static int validate_message(struct hsmp_message *msg)

int hsmp_send_message(struct hsmp_message *msg)
{
	struct hsmp_socket *sock = &plat_dev.sock[msg->sock_ind];
	struct amd_northbridge *nb;
	int ret;

@@ -208,14 +222,13 @@ int hsmp_send_message(struct hsmp_message *msg)
	 * In SMP system timeout of 100 millisecs should
	 * be enough for the previous thread to finish the operation
	 */
	ret = down_timeout(&hsmp_sem[msg->sock_ind],
			   msecs_to_jiffies(HSMP_MSG_TIMEOUT));
	ret = down_timeout(&sock->hsmp_sem, msecs_to_jiffies(HSMP_MSG_TIMEOUT));
	if (ret < 0)
		return ret;

	ret = __hsmp_send_message(nb->root, msg);

	up(&hsmp_sem[msg->sock_ind]);
	up(&sock->hsmp_sem);

	return ret;
}
@@ -321,28 +334,31 @@ static int hsmp_pltdrv_probe(struct platform_device *pdev)
{
	int i;

	hsmp_sem = devm_kzalloc(&pdev->dev,
				(amd_nb_num() * sizeof(struct semaphore)),
	plat_dev.sock = devm_kzalloc(&pdev->dev,
				     (plat_dev.num_sockets * sizeof(struct hsmp_socket)),
				     GFP_KERNEL);
	if (!hsmp_sem)
	if (!plat_dev.sock)
		return -ENOMEM;
	plat_dev.dev = &pdev->dev;

	for (i = 0; i < amd_nb_num(); i++)
		sema_init(&hsmp_sem[i], 1);
	for (i = 0; i < plat_dev.num_sockets; i++) {
		sema_init(&plat_dev.sock[i].hsmp_sem, 1);
		plat_dev.sock[i].sock_ind = i;
	}

	hsmp_device.name	= "hsmp_cdev";
	hsmp_device.minor	= MISC_DYNAMIC_MINOR;
	hsmp_device.fops	= &hsmp_fops;
	hsmp_device.parent	= &pdev->dev;
	hsmp_device.nodename	= "hsmp";
	hsmp_device.mode	= 0644;
	plat_dev.hsmp_device.name	= HSMP_CDEV_NAME;
	plat_dev.hsmp_device.minor	= MISC_DYNAMIC_MINOR;
	plat_dev.hsmp_device.fops	= &hsmp_fops;
	plat_dev.hsmp_device.parent	= &pdev->dev;
	plat_dev.hsmp_device.nodename	= HSMP_DEVNODE_NAME;
	plat_dev.hsmp_device.mode	= 0644;

	return misc_register(&hsmp_device);
	return misc_register(&plat_dev.hsmp_device);
}

static void hsmp_pltdrv_remove(struct platform_device *pdev)
{
	misc_deregister(&hsmp_device);
	misc_deregister(&plat_dev.hsmp_device);
}

static struct platform_driver amd_hsmp_driver = {
@@ -358,7 +374,6 @@ static struct platform_device *amd_hsmp_platdev;
static int __init hsmp_plt_init(void)
{
	int ret = -ENODEV;
	u16 num_sockets;
	int i;

	if (boot_cpu_data.x86_vendor != X86_VENDOR_AMD || boot_cpu_data.x86 < 0x19) {
@@ -371,12 +386,12 @@ static int __init hsmp_plt_init(void)
	 * amd_nb_num() returns number of SMN/DF interfaces present in the system
	 * if we have N SMN/DF interfaces that ideally means N sockets
	 */
	num_sockets = amd_nb_num();
	if (num_sockets == 0)
	plat_dev.num_sockets = amd_nb_num();
	if (plat_dev.num_sockets == 0)
		return ret;

	/* Test the hsmp interface on each socket */
	for (i = 0; i < num_sockets; i++) {
	for (i = 0; i < plat_dev.num_sockets; i++) {
		ret = hsmp_test(i, 0xDEADBEEF);
		if (ret) {
			pr_err("HSMP is not supported on Fam:%x model:%x\n",