162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *	Adaptec AAC series RAID controller driver
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * based on the old aacraid driver that is..
662306a36Sopenharmony_ci * Adaptec aacraid device driver for Linux.
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci * Copyright (c) 2000-2010 Adaptec, Inc.
962306a36Sopenharmony_ci *               2010-2015 PMC-Sierra, Inc. (aacraid@pmc-sierra.com)
1062306a36Sopenharmony_ci *		 2016-2017 Microsemi Corp. (aacraid@microsemi.com)
1162306a36Sopenharmony_ci *
1262306a36Sopenharmony_ci * Module Name:
1362306a36Sopenharmony_ci *  nark.c
1462306a36Sopenharmony_ci *
1562306a36Sopenharmony_ci * Abstract: Hardware Device Interface for NEMER/ARK
1662306a36Sopenharmony_ci */
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#include <linux/pci.h>
1962306a36Sopenharmony_ci#include <linux/blkdev.h>
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci#include <scsi/scsi_host.h>
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci#include "aacraid.h"
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci/**
2662306a36Sopenharmony_ci *	aac_nark_ioremap
2762306a36Sopenharmony_ci *	@dev: device to ioremap
2862306a36Sopenharmony_ci *	@size: mapping resize request
2962306a36Sopenharmony_ci *
3062306a36Sopenharmony_ci */
3162306a36Sopenharmony_cistatic int aac_nark_ioremap(struct aac_dev * dev, u32 size)
3262306a36Sopenharmony_ci{
3362306a36Sopenharmony_ci	if (!size) {
3462306a36Sopenharmony_ci		iounmap(dev->regs.rx);
3562306a36Sopenharmony_ci		dev->regs.rx = NULL;
3662306a36Sopenharmony_ci		iounmap(dev->base);
3762306a36Sopenharmony_ci		dev->base = NULL;
3862306a36Sopenharmony_ci		return 0;
3962306a36Sopenharmony_ci	}
4062306a36Sopenharmony_ci	dev->base_start = pci_resource_start(dev->pdev, 2);
4162306a36Sopenharmony_ci	dev->regs.rx = ioremap((u64)pci_resource_start(dev->pdev, 0) |
4262306a36Sopenharmony_ci	  ((u64)pci_resource_start(dev->pdev, 1) << 32),
4362306a36Sopenharmony_ci	  sizeof(struct rx_registers) - sizeof(struct rx_inbound));
4462306a36Sopenharmony_ci	dev->base = NULL;
4562306a36Sopenharmony_ci	if (dev->regs.rx == NULL)
4662306a36Sopenharmony_ci		return -1;
4762306a36Sopenharmony_ci	dev->base = ioremap(dev->base_start, size);
4862306a36Sopenharmony_ci	if (dev->base == NULL) {
4962306a36Sopenharmony_ci		iounmap(dev->regs.rx);
5062306a36Sopenharmony_ci		dev->regs.rx = NULL;
5162306a36Sopenharmony_ci		return -1;
5262306a36Sopenharmony_ci	}
5362306a36Sopenharmony_ci	dev->IndexRegs = &((struct rx_registers __iomem *)dev->base)->IndexRegs;
5462306a36Sopenharmony_ci	return 0;
5562306a36Sopenharmony_ci}
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci/**
5862306a36Sopenharmony_ci *	aac_nark_init	-	initialize an NEMER/ARK Split Bar card
5962306a36Sopenharmony_ci *	@dev: device to configure
6062306a36Sopenharmony_ci *
6162306a36Sopenharmony_ci */
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ciint aac_nark_init(struct aac_dev * dev)
6462306a36Sopenharmony_ci{
6562306a36Sopenharmony_ci	/*
6662306a36Sopenharmony_ci	 *	Fill in the function dispatch table.
6762306a36Sopenharmony_ci	 */
6862306a36Sopenharmony_ci	dev->a_ops.adapter_ioremap = aac_nark_ioremap;
6962306a36Sopenharmony_ci	dev->a_ops.adapter_comm = aac_rx_select_comm;
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci	return _aac_rx_init(dev);
7262306a36Sopenharmony_ci}
73