pciehp_hpc.c 30.2 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
/*
 * PCI Express PCI Hot Plug Driver
 *
 * Copyright (C) 1995,2001 Compaq Computer Corporation
 * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com)
 * Copyright (C) 2001 IBM Corp.
 * Copyright (C) 2003-2004 Intel Corporation
 *
 * All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or (at
 * your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
 * NON INFRINGEMENT.  See the GNU General Public License for more
 * details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
26
 * Send feedback to <greg@kroah.com>,<kristen.c.accardi@intel.com>
L
Linus Torvalds 已提交
27 28 29 30 31 32
 *
 */

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/types.h>
33 34 35
#include <linux/signal.h>
#include <linux/jiffies.h>
#include <linux/timer.h>
L
Linus Torvalds 已提交
36
#include <linux/pci.h>
A
Andrew Morton 已提交
37
#include <linux/interrupt.h>
38
#include <linux/time.h>
A
Andrew Morton 已提交
39

L
Linus Torvalds 已提交
40 41 42
#include "../pci.h"
#include "pciehp.h"

K
Kenji Kaneshige 已提交
43 44
static atomic_t pciehp_num_controllers = ATOMIC_INIT(0);

L
Linus Torvalds 已提交
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
struct ctrl_reg {
	u8 cap_id;
	u8 nxt_ptr;
	u16 cap_reg;
	u32 dev_cap;
	u16 dev_ctrl;
	u16 dev_status;
	u32 lnk_cap;
	u16 lnk_ctrl;
	u16 lnk_status;
	u32 slot_cap;
	u16 slot_ctrl;
	u16 slot_status;
	u16 root_ctrl;
	u16 rsvp;
	u32 root_status;
} __attribute__ ((packed));

/* offsets to the controller registers based on the above structure layout */
enum ctrl_offsets {
	PCIECAPID	=	offsetof(struct ctrl_reg, cap_id),
	NXTCAPPTR	=	offsetof(struct ctrl_reg, nxt_ptr),
	CAPREG		=	offsetof(struct ctrl_reg, cap_reg),
	DEVCAP		=	offsetof(struct ctrl_reg, dev_cap),
	DEVCTRL		=	offsetof(struct ctrl_reg, dev_ctrl),
	DEVSTATUS	=	offsetof(struct ctrl_reg, dev_status),
	LNKCAP		=	offsetof(struct ctrl_reg, lnk_cap),
	LNKCTRL		=	offsetof(struct ctrl_reg, lnk_ctrl),
	LNKSTATUS	=	offsetof(struct ctrl_reg, lnk_status),
	SLOTCAP		=	offsetof(struct ctrl_reg, slot_cap),
	SLOTCTRL	=	offsetof(struct ctrl_reg, slot_ctrl),
	SLOTSTATUS	=	offsetof(struct ctrl_reg, slot_status),
	ROOTCTRL	=	offsetof(struct ctrl_reg, root_ctrl),
	ROOTSTATUS	=	offsetof(struct ctrl_reg, root_status),
};

81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
static inline int pciehp_readw(struct controller *ctrl, int reg, u16 *value)
{
	struct pci_dev *dev = ctrl->pci_dev;
	return pci_read_config_word(dev, ctrl->cap_base + reg, value);
}

static inline int pciehp_readl(struct controller *ctrl, int reg, u32 *value)
{
	struct pci_dev *dev = ctrl->pci_dev;
	return pci_read_config_dword(dev, ctrl->cap_base + reg, value);
}

static inline int pciehp_writew(struct controller *ctrl, int reg, u16 value)
{
	struct pci_dev *dev = ctrl->pci_dev;
	return pci_write_config_word(dev, ctrl->cap_base + reg, value);
}

static inline int pciehp_writel(struct controller *ctrl, int reg, u32 value)
{
	struct pci_dev *dev = ctrl->pci_dev;
	return pci_write_config_dword(dev, ctrl->cap_base + reg, value);
}
L
Linus Torvalds 已提交
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131

/* Field definitions in PCI Express Capabilities Register */
#define CAP_VER			0x000F
#define DEV_PORT_TYPE		0x00F0
#define SLOT_IMPL		0x0100
#define MSG_NUM			0x3E00

/* Device or Port Type */
#define NAT_ENDPT		0x00
#define LEG_ENDPT		0x01
#define ROOT_PORT		0x04
#define UP_STREAM		0x05
#define	DN_STREAM		0x06
#define PCIE_PCI_BRDG		0x07
#define PCI_PCIE_BRDG		0x10

/* Field definitions in Device Capabilities Register */
#define DATTN_BUTTN_PRSN	0x1000
#define DATTN_LED_PRSN		0x2000
#define DPWR_LED_PRSN		0x4000

/* Field definitions in Link Capabilities Register */
#define MAX_LNK_SPEED		0x000F
#define MAX_LNK_WIDTH		0x03F0

/* Link Width Encoding */
#define LNK_X1		0x01
#define LNK_X2		0x02
132
#define LNK_X4		0x04
L
Linus Torvalds 已提交
133 134
#define LNK_X8		0x08
#define LNK_X12		0x0C
135
#define LNK_X16		0x10
L
Linus Torvalds 已提交
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
#define LNK_X32		0x20

/*Field definitions of Link Status Register */
#define LNK_SPEED	0x000F
#define NEG_LINK_WD	0x03F0
#define LNK_TRN_ERR	0x0400
#define	LNK_TRN		0x0800
#define SLOT_CLK_CONF	0x1000

/* Field definitions in Slot Capabilities Register */
#define ATTN_BUTTN_PRSN	0x00000001
#define	PWR_CTRL_PRSN	0x00000002
#define MRL_SENS_PRSN	0x00000004
#define ATTN_LED_PRSN	0x00000008
#define PWR_LED_PRSN	0x00000010
#define HP_SUPR_RM_SUP	0x00000020
#define HP_CAP		0x00000040
#define SLOT_PWR_VALUE	0x000003F8
#define SLOT_PWR_LIMIT	0x00000C00
#define PSN		0xFFF80000	/* PSN: Physical Slot Number */

/* Field definitions in Slot Control Register */
#define ATTN_BUTTN_ENABLE		0x0001
#define PWR_FAULT_DETECT_ENABLE		0x0002
#define MRL_DETECT_ENABLE		0x0004
#define PRSN_DETECT_ENABLE		0x0008
#define CMD_CMPL_INTR_ENABLE		0x0010
#define HP_INTR_ENABLE			0x0020
#define ATTN_LED_CTRL			0x00C0
#define PWR_LED_CTRL			0x0300
#define PWR_CTRL			0x0400
167
#define EMI_CTRL			0x0800
L
Linus Torvalds 已提交
168 169 170 171 172 173 174 175 176 177

/* Attention indicator and Power indicator states */
#define LED_ON		0x01
#define LED_BLINK	0x10
#define LED_OFF		0x11

/* Power Control Command */
#define POWER_ON	0
#define POWER_OFF	0x0400

178 179 180 181
/* EMI Status defines */
#define EMI_DISENGAGED	0
#define EMI_ENGAGED	1

L
Linus Torvalds 已提交
182 183 184 185 186 187 188 189
/* Field definitions in Slot Status Register */
#define ATTN_BUTTN_PRESSED	0x0001
#define PWR_FAULT_DETECTED	0x0002
#define MRL_SENS_CHANGED	0x0004
#define PRSN_DETECT_CHANGED	0x0008
#define CMD_COMPLETED		0x0010
#define MRL_STATE		0x0020
#define PRSN_STATE		0x0040
190 191
#define EMI_STATE		0x0080
#define EMI_STATUS_BIT		7
L
Linus Torvalds 已提交
192

193 194
static irqreturn_t pcie_isr(int irq, void *dev_id);
static void start_int_poll_timer(struct controller *ctrl, int sec);
L
Linus Torvalds 已提交
195 196

/* This is the interrupt polling timeout function. */
197
static void int_poll_timeout(unsigned long data)
L
Linus Torvalds 已提交
198
{
199
	struct controller *ctrl = (struct controller *)data;
L
Linus Torvalds 已提交
200 201

	/* Poll for interrupt events.  regs == NULL => polling */
202
	pcie_isr(0, ctrl);
L
Linus Torvalds 已提交
203

204
	init_timer(&ctrl->poll_timer);
L
Linus Torvalds 已提交
205
	if (!pciehp_poll_time)
206
		pciehp_poll_time = 2; /* default polling interval is 2 sec */
L
Linus Torvalds 已提交
207

208
	start_int_poll_timer(ctrl, pciehp_poll_time);
L
Linus Torvalds 已提交
209 210 211
}

/* This function starts the interrupt polling timer. */
212
static void start_int_poll_timer(struct controller *ctrl, int sec)
L
Linus Torvalds 已提交
213
{
214 215 216 217 218 219 220 221
	/* Clamp to sane value */
	if ((sec <= 0) || (sec > 60))
        	sec = 2;

	ctrl->poll_timer.function = &int_poll_timeout;
	ctrl->poll_timer.data = (unsigned long)ctrl;
	ctrl->poll_timer.expires = jiffies + sec * HZ;
	add_timer(&ctrl->poll_timer);
L
Linus Torvalds 已提交
222 223
}

K
Kenji Kaneshige 已提交
224 225
static inline int pciehp_request_irq(struct controller *ctrl)
{
226
	int retval, irq = ctrl->pcie->irq;
K
Kenji Kaneshige 已提交
227 228 229 230 231 232 233 234 235 236 237

	/* Install interrupt polling timer. Start with 10 sec delay */
	if (pciehp_poll_mode) {
		init_timer(&ctrl->poll_timer);
		start_int_poll_timer(ctrl, 10);
		return 0;
	}

	/* Installs the interrupt handler */
	retval = request_irq(irq, pcie_isr, IRQF_SHARED, MY_NAME, ctrl);
	if (retval)
238 239
		ctrl_err(ctrl, "Cannot get irq %d for the hotplug controller\n",
			 irq);
K
Kenji Kaneshige 已提交
240 241 242 243 244 245 246 247
	return retval;
}

static inline void pciehp_free_irq(struct controller *ctrl)
{
	if (pciehp_poll_mode)
		del_timer_sync(&ctrl->poll_timer);
	else
248
		free_irq(ctrl->pcie->irq, ctrl);
K
Kenji Kaneshige 已提交
249 250
}

251
static int pcie_poll_cmd(struct controller *ctrl)
252 253 254 255
{
	u16 slot_status;
	int timeout = 1000;

K
Kenji Kaneshige 已提交
256 257 258 259 260 261
	if (!pciehp_readw(ctrl, SLOTSTATUS, &slot_status)) {
		if (slot_status & CMD_COMPLETED) {
			pciehp_writew(ctrl, SLOTSTATUS, CMD_COMPLETED);
			return 1;
		}
	}
A
Adrian Bunk 已提交
262
	while (timeout > 0) {
263 264
		msleep(10);
		timeout -= 10;
K
Kenji Kaneshige 已提交
265 266 267 268 269 270
		if (!pciehp_readw(ctrl, SLOTSTATUS, &slot_status)) {
			if (slot_status & CMD_COMPLETED) {
				pciehp_writew(ctrl, SLOTSTATUS, CMD_COMPLETED);
				return 1;
			}
		}
271 272 273 274
	}
	return 0;	/* timeout */
}

275
static void pcie_wait_cmd(struct controller *ctrl, int poll)
276
{
277 278 279 280
	unsigned int msecs = pciehp_poll_mode ? 2500 : 1000;
	unsigned long timeout = msecs_to_jiffies(msecs);
	int rc;

281 282 283
	if (poll)
		rc = pcie_poll_cmd(ctrl);
	else
284
		rc = wait_event_timeout(ctrl->queue, !ctrl->cmd_busy, timeout);
285
	if (!rc)
286
		ctrl_dbg(ctrl, "Command not completed in 1000 msec\n");
287 288
}

289 290
/**
 * pcie_write_cmd - Issue controller command
291
 * @ctrl: controller to which the command is issued
292 293 294
 * @cmd:  command value written to slot control register
 * @mask: bitmask of slot control register to be modified
 */
295
static int pcie_write_cmd(struct controller *ctrl, u16 cmd, u16 mask)
L
Linus Torvalds 已提交
296 297 298
{
	int retval = 0;
	u16 slot_status;
299
	u16 slot_ctrl;
L
Linus Torvalds 已提交
300

301 302
	mutex_lock(&ctrl->ctrl_lock);

303
	retval = pciehp_readw(ctrl, SLOTSTATUS, &slot_status);
L
Linus Torvalds 已提交
304
	if (retval) {
305 306
		ctrl_err(ctrl, "%s: Cannot read SLOTSTATUS register\n",
			 __func__);
307
		goto out;
308 309
	}

K
Kenji Kaneshige 已提交
310 311 312 313 314 315 316
	if (slot_status & CMD_COMPLETED) {
		if (!ctrl->no_cmd_complete) {
			/*
			 * After 1 sec and CMD_COMPLETED still not set, just
			 * proceed forward to issue the next command according
			 * to spec. Just print out the error message.
			 */
317 318 319
			ctrl_dbg(ctrl,
				 "%s: CMD_COMPLETED not clear after 1 sec.\n",
				 __func__);
K
Kenji Kaneshige 已提交
320 321 322 323 324 325
		} else if (!NO_CMD_CMPL(ctrl)) {
			/*
			 * This controller semms to notify of command completed
			 * event even though it supports none of power
			 * controller, attention led, power led and EMI.
			 */
326 327 328
			ctrl_dbg(ctrl, "%s: Unexpected CMD_COMPLETED. Need to "
				 "wait for command completed event.\n",
				 __func__);
K
Kenji Kaneshige 已提交
329 330
			ctrl->no_cmd_complete = 0;
		} else {
331 332
			ctrl_dbg(ctrl, "%s: Unexpected CMD_COMPLETED. Maybe "
				 "the controller is broken.\n", __func__);
K
Kenji Kaneshige 已提交
333
		}
L
Linus Torvalds 已提交
334 335
	}

336
	retval = pciehp_readw(ctrl, SLOTCTRL, &slot_ctrl);
L
Linus Torvalds 已提交
337
	if (retval) {
338
		ctrl_err(ctrl, "%s: Cannot read SLOTCTRL register\n", __func__);
339
		goto out;
L
Linus Torvalds 已提交
340 341
	}

342
	slot_ctrl &= ~mask;
K
Kenji Kaneshige 已提交
343
	slot_ctrl |= (cmd & mask);
344
	ctrl->cmd_busy = 1;
345
	smp_mb();
346 347
	retval = pciehp_writew(ctrl, SLOTCTRL, slot_ctrl);
	if (retval)
348 349
		ctrl_err(ctrl, "%s: Cannot write to SLOTCTRL register\n",
			 __func__);
350

351 352 353
	/*
	 * Wait for command completion.
	 */
354 355 356 357 358 359 360 361 362 363
	if (!retval && !ctrl->no_cmd_complete) {
		int poll = 0;
		/*
		 * if hotplug interrupt is not enabled or command
		 * completed interrupt is not enabled, we need to poll
		 * command completed event.
		 */
		if (!(slot_ctrl & HP_INTR_ENABLE) ||
		    !(slot_ctrl & CMD_CMPL_INTR_ENABLE))
			poll = 1;
364
                pcie_wait_cmd(ctrl, poll);
365
	}
366 367
 out:
	mutex_unlock(&ctrl->ctrl_lock);
L
Linus Torvalds 已提交
368 369 370 371 372 373 374 375
	return retval;
}

static int hpc_check_lnk_status(struct controller *ctrl)
{
	u16 lnk_status;
	int retval = 0;

376
	retval = pciehp_readw(ctrl, LNKSTATUS, &lnk_status);
L
Linus Torvalds 已提交
377
	if (retval) {
378 379
		ctrl_err(ctrl, "%s: Cannot read LNKSTATUS register\n",
			 __func__);
L
Linus Torvalds 已提交
380 381 382
		return retval;
	}

383
	ctrl_dbg(ctrl, "%s: lnk_status = %x\n", __func__, lnk_status);
384
	if ( (lnk_status & LNK_TRN) || (lnk_status & LNK_TRN_ERR) ||
L
Linus Torvalds 已提交
385
		!(lnk_status & NEG_LINK_WD)) {
386
		ctrl_err(ctrl, "%s : Link Training Error occurs \n", __func__);
L
Linus Torvalds 已提交
387 388 389 390 391 392 393 394 395
		retval = -1;
		return retval;
	}

	return retval;
}

static int hpc_get_attention_status(struct slot *slot, u8 *status)
{
396
	struct controller *ctrl = slot->ctrl;
L
Linus Torvalds 已提交
397 398 399 400
	u16 slot_ctrl;
	u8 atten_led_state;
	int retval = 0;

401
	retval = pciehp_readw(ctrl, SLOTCTRL, &slot_ctrl);
L
Linus Torvalds 已提交
402
	if (retval) {
403
		ctrl_err(ctrl, "%s: Cannot read SLOTCTRL register\n", __func__);
L
Linus Torvalds 已提交
404 405 406
		return retval;
	}

407 408
	ctrl_dbg(ctrl, "%s: SLOTCTRL %x, value read %x\n",
		 __func__, ctrl->cap_base + SLOTCTRL, slot_ctrl);
L
Linus Torvalds 已提交
409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432

	atten_led_state = (slot_ctrl & ATTN_LED_CTRL) >> 6;

	switch (atten_led_state) {
	case 0:
		*status = 0xFF;	/* Reserved */
		break;
	case 1:
		*status = 1;	/* On */
		break;
	case 2:
		*status = 2;	/* Blink */
		break;
	case 3:
		*status = 0;	/* Off */
		break;
	default:
		*status = 0xFF;
		break;
	}

	return 0;
}

433
static int hpc_get_power_status(struct slot *slot, u8 *status)
L
Linus Torvalds 已提交
434
{
435
	struct controller *ctrl = slot->ctrl;
L
Linus Torvalds 已提交
436 437 438 439
	u16 slot_ctrl;
	u8 pwr_state;
	int	retval = 0;

440
	retval = pciehp_readw(ctrl, SLOTCTRL, &slot_ctrl);
L
Linus Torvalds 已提交
441
	if (retval) {
442
		ctrl_err(ctrl, "%s: Cannot read SLOTCTRL register\n", __func__);
L
Linus Torvalds 已提交
443 444
		return retval;
	}
445 446
	ctrl_dbg(ctrl, "%s: SLOTCTRL %x value read %x\n",
		 __func__, ctrl->cap_base + SLOTCTRL, slot_ctrl);
L
Linus Torvalds 已提交
447 448 449 450 451 452 453 454

	pwr_state = (slot_ctrl & PWR_CTRL) >> 10;

	switch (pwr_state) {
	case 0:
		*status = 1;
		break;
	case 1:
455
		*status = 0;
L
Linus Torvalds 已提交
456 457 458 459 460 461 462 463 464 465 466
		break;
	default:
		*status = 0xFF;
		break;
	}

	return retval;
}

static int hpc_get_latch_status(struct slot *slot, u8 *status)
{
467
	struct controller *ctrl = slot->ctrl;
L
Linus Torvalds 已提交
468 469 470
	u16 slot_status;
	int retval = 0;

471
	retval = pciehp_readw(ctrl, SLOTSTATUS, &slot_status);
L
Linus Torvalds 已提交
472
	if (retval) {
473 474
		ctrl_err(ctrl, "%s: Cannot read SLOTSTATUS register\n",
			 __func__);
L
Linus Torvalds 已提交
475 476 477
		return retval;
	}

478
	*status = (((slot_status & MRL_STATE) >> 5) == 0) ? 0 : 1;
L
Linus Torvalds 已提交
479 480 481 482 483 484

	return 0;
}

static int hpc_get_adapter_status(struct slot *slot, u8 *status)
{
485
	struct controller *ctrl = slot->ctrl;
L
Linus Torvalds 已提交
486 487 488 489
	u16 slot_status;
	u8 card_state;
	int retval = 0;

490
	retval = pciehp_readw(ctrl, SLOTSTATUS, &slot_status);
L
Linus Torvalds 已提交
491
	if (retval) {
492 493
		ctrl_err(ctrl, "%s: Cannot read SLOTSTATUS register\n",
			 __func__);
L
Linus Torvalds 已提交
494 495 496 497 498 499 500 501
		return retval;
	}
	card_state = (u8)((slot_status & PRSN_STATE) >> 6);
	*status = (card_state == 1) ? 1 : 0;

	return 0;
}

502
static int hpc_query_power_fault(struct slot *slot)
L
Linus Torvalds 已提交
503
{
504
	struct controller *ctrl = slot->ctrl;
L
Linus Torvalds 已提交
505 506 507 508
	u16 slot_status;
	u8 pwr_fault;
	int retval = 0;

509
	retval = pciehp_readw(ctrl, SLOTSTATUS, &slot_status);
L
Linus Torvalds 已提交
510
	if (retval) {
511
		ctrl_err(ctrl, "%s: Cannot check for power fault\n", __func__);
L
Linus Torvalds 已提交
512 513 514
		return retval;
	}
	pwr_fault = (u8)((slot_status & PWR_FAULT_DETECTED) >> 1);
515

516
	return pwr_fault;
L
Linus Torvalds 已提交
517 518
}

519 520 521 522 523 524 525 526
static int hpc_get_emi_status(struct slot *slot, u8 *status)
{
	struct controller *ctrl = slot->ctrl;
	u16 slot_status;
	int retval = 0;

	retval = pciehp_readw(ctrl, SLOTSTATUS, &slot_status);
	if (retval) {
527
		ctrl_err(ctrl, "%s : Cannot check EMI status\n", __func__);
528 529 530 531 532 533 534 535 536
		return retval;
	}
	*status = (slot_status & EMI_STATE) >> EMI_STATUS_BIT;

	return retval;
}

static int hpc_toggle_emi(struct slot *slot)
{
537 538 539
	u16 slot_cmd;
	u16 cmd_mask;
	int rc;
540

541 542
	slot_cmd = EMI_CTRL;
	cmd_mask = EMI_CTRL;
543
	rc = pcie_write_cmd(slot->ctrl, slot_cmd, cmd_mask);
544
	slot->last_emi_toggle = get_seconds();
K
Kenji Kaneshige 已提交
545

546 547 548
	return rc;
}

L
Linus Torvalds 已提交
549 550
static int hpc_set_attention_status(struct slot *slot, u8 value)
{
551
	struct controller *ctrl = slot->ctrl;
552 553 554
	u16 slot_cmd;
	u16 cmd_mask;
	int rc;
L
Linus Torvalds 已提交
555

556
	cmd_mask = ATTN_LED_CTRL;
L
Linus Torvalds 已提交
557 558
	switch (value) {
		case 0 :	/* turn off */
559
			slot_cmd = 0x00C0;
L
Linus Torvalds 已提交
560 561
			break;
		case 1:		/* turn on */
562
			slot_cmd = 0x0040;
L
Linus Torvalds 已提交
563 564
			break;
		case 2:		/* turn blink */
565
			slot_cmd = 0x0080;
L
Linus Torvalds 已提交
566 567 568 569
			break;
		default:
			return -1;
	}
570
	rc = pcie_write_cmd(ctrl, slot_cmd, cmd_mask);
571 572
	ctrl_dbg(ctrl, "%s: SLOTCTRL %x write cmd %x\n",
		 __func__, ctrl->cap_base + SLOTCTRL, slot_cmd);
573

L
Linus Torvalds 已提交
574 575 576 577 578
	return rc;
}

static void hpc_set_green_led_on(struct slot *slot)
{
579
	struct controller *ctrl = slot->ctrl;
L
Linus Torvalds 已提交
580
	u16 slot_cmd;
581
	u16 cmd_mask;
582

583 584
	slot_cmd = 0x0100;
	cmd_mask = PWR_LED_CTRL;
585
	pcie_write_cmd(ctrl, slot_cmd, cmd_mask);
586 587
	ctrl_dbg(ctrl, "%s: SLOTCTRL %x write cmd %x\n",
		 __func__, ctrl->cap_base + SLOTCTRL, slot_cmd);
L
Linus Torvalds 已提交
588 589 590 591
}

static void hpc_set_green_led_off(struct slot *slot)
{
592
	struct controller *ctrl = slot->ctrl;
L
Linus Torvalds 已提交
593
	u16 slot_cmd;
594
	u16 cmd_mask;
L
Linus Torvalds 已提交
595

596 597
	slot_cmd = 0x0300;
	cmd_mask = PWR_LED_CTRL;
598
	pcie_write_cmd(ctrl, slot_cmd, cmd_mask);
599 600
	ctrl_dbg(ctrl, "%s: SLOTCTRL %x write cmd %x\n",
		 __func__, ctrl->cap_base + SLOTCTRL, slot_cmd);
L
Linus Torvalds 已提交
601 602 603 604
}

static void hpc_set_green_led_blink(struct slot *slot)
{
605
	struct controller *ctrl = slot->ctrl;
L
Linus Torvalds 已提交
606
	u16 slot_cmd;
607
	u16 cmd_mask;
608

609 610
	slot_cmd = 0x0200;
	cmd_mask = PWR_LED_CTRL;
611
	pcie_write_cmd(ctrl, slot_cmd, cmd_mask);
612 613
	ctrl_dbg(ctrl, "%s: SLOTCTRL %x write cmd %x\n",
		 __func__, ctrl->cap_base + SLOTCTRL, slot_cmd);
L
Linus Torvalds 已提交
614 615 616 617
}

static int hpc_power_on_slot(struct slot * slot)
{
618
	struct controller *ctrl = slot->ctrl;
L
Linus Torvalds 已提交
619
	u16 slot_cmd;
620 621
	u16 cmd_mask;
	u16 slot_status;
L
Linus Torvalds 已提交
622 623
	int retval = 0;

624
	ctrl_dbg(ctrl, "%s: slot->hp_slot %x\n", __func__, slot->hp_slot);
L
Linus Torvalds 已提交
625

626
	/* Clear sticky power-fault bit from previous power failures */
627 628
	retval = pciehp_readw(ctrl, SLOTSTATUS, &slot_status);
	if (retval) {
629 630
		ctrl_err(ctrl, "%s: Cannot read SLOTSTATUS register\n",
			 __func__);
631 632
		return retval;
	}
633
	slot_status &= PWR_FAULT_DETECTED;
634 635 636
	if (slot_status) {
		retval = pciehp_writew(ctrl, SLOTSTATUS, slot_status);
		if (retval) {
637 638 639
			ctrl_err(ctrl,
				 "%s: Cannot write to SLOTSTATUS register\n",
				 __func__);
640 641 642
			return retval;
		}
	}
L
Linus Torvalds 已提交
643

644 645
	slot_cmd = POWER_ON;
	cmd_mask = PWR_CTRL;
646
	/* Enable detection that we turned off at slot power-off time */
647
	if (!pciehp_poll_mode) {
648 649 650 651
		slot_cmd |= (PWR_FAULT_DETECT_ENABLE | MRL_DETECT_ENABLE |
			     PRSN_DETECT_ENABLE);
		cmd_mask |= (PWR_FAULT_DETECT_ENABLE | MRL_DETECT_ENABLE |
			     PRSN_DETECT_ENABLE);
652
	}
L
Linus Torvalds 已提交
653

654
	retval = pcie_write_cmd(ctrl, slot_cmd, cmd_mask);
L
Linus Torvalds 已提交
655 656

	if (retval) {
657 658
		ctrl_err(ctrl, "%s: Write %x command failed!\n",
			 __func__, slot_cmd);
L
Linus Torvalds 已提交
659 660
		return -1;
	}
661 662
	ctrl_dbg(ctrl, "%s: SLOTCTRL %x write cmd %x\n",
		 __func__, ctrl->cap_base + SLOTCTRL, slot_cmd);
L
Linus Torvalds 已提交
663 664 665 666

	return retval;
}

667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699
static inline int pcie_mask_bad_dllp(struct controller *ctrl)
{
	struct pci_dev *dev = ctrl->pci_dev;
	int pos;
	u32 reg;

	pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR);
	if (!pos)
		return 0;
	pci_read_config_dword(dev, pos + PCI_ERR_COR_MASK, &reg);
	if (reg & PCI_ERR_COR_BAD_DLLP)
		return 0;
	reg |= PCI_ERR_COR_BAD_DLLP;
	pci_write_config_dword(dev, pos + PCI_ERR_COR_MASK, reg);
	return 1;
}

static inline void pcie_unmask_bad_dllp(struct controller *ctrl)
{
	struct pci_dev *dev = ctrl->pci_dev;
	u32 reg;
	int pos;

	pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR);
	if (!pos)
		return;
	pci_read_config_dword(dev, pos + PCI_ERR_COR_MASK, &reg);
	if (!(reg & PCI_ERR_COR_BAD_DLLP))
		return;
	reg &= ~PCI_ERR_COR_BAD_DLLP;
	pci_write_config_dword(dev, pos + PCI_ERR_COR_MASK, reg);
}

L
Linus Torvalds 已提交
700 701
static int hpc_power_off_slot(struct slot * slot)
{
702
	struct controller *ctrl = slot->ctrl;
L
Linus Torvalds 已提交
703
	u16 slot_cmd;
704
	u16 cmd_mask;
L
Linus Torvalds 已提交
705
	int retval = 0;
706
	int changed;
L
Linus Torvalds 已提交
707

708
	ctrl_dbg(ctrl, "%s: slot->hp_slot %x\n", __func__, slot->hp_slot);
L
Linus Torvalds 已提交
709

710 711 712 713 714 715 716 717
	/*
	 * Set Bad DLLP Mask bit in Correctable Error Mask
	 * Register. This is the workaround against Bad DLLP error
	 * that sometimes happens during turning power off the slot
	 * which conforms to PCI Express 1.0a spec.
	 */
	changed = pcie_mask_bad_dllp(ctrl);

718 719
	slot_cmd = POWER_OFF;
	cmd_mask = PWR_CTRL;
720 721 722 723 724 725 726
	/*
	 * If we get MRL or presence detect interrupts now, the isr
	 * will notice the sticky power-fault bit too and issue power
	 * indicator change commands. This will lead to an endless loop
	 * of command completions, since the power-fault bit remains on
	 * till the slot is powered on again.
	 */
727
	if (!pciehp_poll_mode) {
728 729 730 731
		slot_cmd &= ~(PWR_FAULT_DETECT_ENABLE | MRL_DETECT_ENABLE |
			      PRSN_DETECT_ENABLE);
		cmd_mask |= (PWR_FAULT_DETECT_ENABLE | MRL_DETECT_ENABLE |
			     PRSN_DETECT_ENABLE);
732
	}
L
Linus Torvalds 已提交
733

734
	retval = pcie_write_cmd(ctrl, slot_cmd, cmd_mask);
L
Linus Torvalds 已提交
735
	if (retval) {
736
		ctrl_err(ctrl, "%s: Write command failed!\n", __func__);
737 738
		retval = -1;
		goto out;
L
Linus Torvalds 已提交
739
	}
740 741
	ctrl_dbg(ctrl, "%s: SLOTCTRL %x write cmd %x\n",
		 __func__, ctrl->cap_base + SLOTCTRL, slot_cmd);
742
 out:
743 744 745
	if (changed)
		pcie_unmask_bad_dllp(ctrl);

L
Linus Torvalds 已提交
746 747 748
	return retval;
}

749
static irqreturn_t pcie_isr(int irq, void *dev_id)
L
Linus Torvalds 已提交
750
{
751
	struct controller *ctrl = (struct controller *)dev_id;
752
	u16 detected, intr_loc;
753
	struct slot *p_slot;
L
Linus Torvalds 已提交
754

755 756 757 758 759 760 761 762
	/*
	 * In order to guarantee that all interrupt events are
	 * serviced, we need to re-inspect Slot Status register after
	 * clearing what is presumed to be the last pending interrupt.
	 */
	intr_loc = 0;
	do {
		if (pciehp_readw(ctrl, SLOTSTATUS, &detected)) {
763 764
			ctrl_err(ctrl, "%s: Cannot read SLOTSTATUS\n",
				 __func__);
L
Linus Torvalds 已提交
765 766 767
			return IRQ_NONE;
		}

768 769 770 771 772
		detected &= (ATTN_BUTTN_PRESSED | PWR_FAULT_DETECTED |
			     MRL_SENS_CHANGED | PRSN_DETECT_CHANGED |
			     CMD_COMPLETED);
		intr_loc |= detected;
		if (!intr_loc)
L
Linus Torvalds 已提交
773
			return IRQ_NONE;
774
		if (detected && pciehp_writew(ctrl, SLOTSTATUS, detected)) {
775 776
			ctrl_err(ctrl, "%s: Cannot write to SLOTSTATUS\n",
				 __func__);
L
Linus Torvalds 已提交
777 778
			return IRQ_NONE;
		}
779
	} while (detected);
780

781
	ctrl_dbg(ctrl, "%s: intr_loc %x\n", __func__, intr_loc);
782

783
	/* Check Command Complete Interrupt Pending */
L
Linus Torvalds 已提交
784
	if (intr_loc & CMD_COMPLETED) {
785
		ctrl->cmd_busy = 0;
786
		smp_mb();
787
		wake_up(&ctrl->queue);
L
Linus Torvalds 已提交
788 789
	}

790 791 792 793 794
	if (!(intr_loc & ~CMD_COMPLETED))
		return IRQ_HANDLED;

	p_slot = pciehp_find_slot(ctrl, ctrl->slot_device_offset);

795
	/* Check MRL Sensor Changed */
796
	if (intr_loc & MRL_SENS_CHANGED)
797
		pciehp_handle_switch_change(p_slot);
798

799
	/* Check Attention Button Pressed */
800
	if (intr_loc & ATTN_BUTTN_PRESSED)
801
		pciehp_handle_attention_button(p_slot);
802

803
	/* Check Presence Detect Changed */
804
	if (intr_loc & PRSN_DETECT_CHANGED)
805
		pciehp_handle_presence_change(p_slot);
806

807
	/* Check Power Fault Detected */
808
	if (intr_loc & PWR_FAULT_DETECTED)
809
		pciehp_handle_power_fault(p_slot);
810

L
Linus Torvalds 已提交
811 812 813
	return IRQ_HANDLED;
}

814
static int hpc_get_max_lnk_speed(struct slot *slot, enum pci_bus_speed *value)
L
Linus Torvalds 已提交
815
{
816
	struct controller *ctrl = slot->ctrl;
L
Linus Torvalds 已提交
817 818 819 820
	enum pcie_link_speed lnk_speed;
	u32	lnk_cap;
	int retval = 0;

821
	retval = pciehp_readl(ctrl, LNKCAP, &lnk_cap);
L
Linus Torvalds 已提交
822
	if (retval) {
823
		ctrl_err(ctrl, "%s: Cannot read LNKCAP register\n", __func__);
L
Linus Torvalds 已提交
824 825 826 827 828 829 830 831 832 833 834 835 836
		return retval;
	}

	switch (lnk_cap & 0x000F) {
	case 1:
		lnk_speed = PCIE_2PT5GB;
		break;
	default:
		lnk_speed = PCIE_LNK_SPEED_UNKNOWN;
		break;
	}

	*value = lnk_speed;
837
	ctrl_dbg(ctrl, "Max link speed = %d\n", lnk_speed);
K
Kenji Kaneshige 已提交
838

L
Linus Torvalds 已提交
839 840 841
	return retval;
}

842 843
static int hpc_get_max_lnk_width(struct slot *slot,
				 enum pcie_link_width *value)
L
Linus Torvalds 已提交
844
{
845
	struct controller *ctrl = slot->ctrl;
L
Linus Torvalds 已提交
846 847 848 849
	enum pcie_link_width lnk_wdth;
	u32	lnk_cap;
	int retval = 0;

850
	retval = pciehp_readl(ctrl, LNKCAP, &lnk_cap);
L
Linus Torvalds 已提交
851
	if (retval) {
852
		ctrl_err(ctrl, "%s: Cannot read LNKCAP register\n", __func__);
L
Linus Torvalds 已提交
853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886
		return retval;
	}

	switch ((lnk_cap & 0x03F0) >> 4){
	case 0:
		lnk_wdth = PCIE_LNK_WIDTH_RESRV;
		break;
	case 1:
		lnk_wdth = PCIE_LNK_X1;
		break;
	case 2:
		lnk_wdth = PCIE_LNK_X2;
		break;
	case 4:
		lnk_wdth = PCIE_LNK_X4;
		break;
	case 8:
		lnk_wdth = PCIE_LNK_X8;
		break;
	case 12:
		lnk_wdth = PCIE_LNK_X12;
		break;
	case 16:
		lnk_wdth = PCIE_LNK_X16;
		break;
	case 32:
		lnk_wdth = PCIE_LNK_X32;
		break;
	default:
		lnk_wdth = PCIE_LNK_WIDTH_UNKNOWN;
		break;
	}

	*value = lnk_wdth;
887
	ctrl_dbg(ctrl, "Max link width = %d\n", lnk_wdth);
K
Kenji Kaneshige 已提交
888

L
Linus Torvalds 已提交
889 890 891
	return retval;
}

892
static int hpc_get_cur_lnk_speed(struct slot *slot, enum pci_bus_speed *value)
L
Linus Torvalds 已提交
893
{
894
	struct controller *ctrl = slot->ctrl;
L
Linus Torvalds 已提交
895 896 897 898
	enum pcie_link_speed lnk_speed = PCI_SPEED_UNKNOWN;
	int retval = 0;
	u16 lnk_status;

899
	retval = pciehp_readw(ctrl, LNKSTATUS, &lnk_status);
L
Linus Torvalds 已提交
900
	if (retval) {
901 902
		ctrl_err(ctrl, "%s: Cannot read LNKSTATUS register\n",
			 __func__);
L
Linus Torvalds 已提交
903 904 905 906 907 908 909 910 911 912 913 914 915
		return retval;
	}

	switch (lnk_status & 0x0F) {
	case 1:
		lnk_speed = PCIE_2PT5GB;
		break;
	default:
		lnk_speed = PCIE_LNK_SPEED_UNKNOWN;
		break;
	}

	*value = lnk_speed;
916
	ctrl_dbg(ctrl, "Current link speed = %d\n", lnk_speed);
K
Kenji Kaneshige 已提交
917

L
Linus Torvalds 已提交
918 919 920
	return retval;
}

921 922
static int hpc_get_cur_lnk_width(struct slot *slot,
				 enum pcie_link_width *value)
L
Linus Torvalds 已提交
923
{
924
	struct controller *ctrl = slot->ctrl;
L
Linus Torvalds 已提交
925 926 927 928
	enum pcie_link_width lnk_wdth = PCIE_LNK_WIDTH_UNKNOWN;
	int retval = 0;
	u16 lnk_status;

929
	retval = pciehp_readw(ctrl, LNKSTATUS, &lnk_status);
L
Linus Torvalds 已提交
930
	if (retval) {
931 932
		ctrl_err(ctrl, "%s: Cannot read LNKSTATUS register\n",
			 __func__);
L
Linus Torvalds 已提交
933 934
		return retval;
	}
935

L
Linus Torvalds 已提交
936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966
	switch ((lnk_status & 0x03F0) >> 4){
	case 0:
		lnk_wdth = PCIE_LNK_WIDTH_RESRV;
		break;
	case 1:
		lnk_wdth = PCIE_LNK_X1;
		break;
	case 2:
		lnk_wdth = PCIE_LNK_X2;
		break;
	case 4:
		lnk_wdth = PCIE_LNK_X4;
		break;
	case 8:
		lnk_wdth = PCIE_LNK_X8;
		break;
	case 12:
		lnk_wdth = PCIE_LNK_X12;
		break;
	case 16:
		lnk_wdth = PCIE_LNK_X16;
		break;
	case 32:
		lnk_wdth = PCIE_LNK_X32;
		break;
	default:
		lnk_wdth = PCIE_LNK_WIDTH_UNKNOWN;
		break;
	}

	*value = lnk_wdth;
967
	ctrl_dbg(ctrl, "Current link width = %d\n", lnk_wdth);
K
Kenji Kaneshige 已提交
968

L
Linus Torvalds 已提交
969 970 971
	return retval;
}

972
static void pcie_release_ctrl(struct controller *ctrl);
L
Linus Torvalds 已提交
973 974 975 976 977 978 979 980
static struct hpc_ops pciehp_hpc_ops = {
	.power_on_slot			= hpc_power_on_slot,
	.power_off_slot			= hpc_power_off_slot,
	.set_attention_status		= hpc_set_attention_status,
	.get_power_status		= hpc_get_power_status,
	.get_attention_status		= hpc_get_attention_status,
	.get_latch_status		= hpc_get_latch_status,
	.get_adapter_status		= hpc_get_adapter_status,
981 982
	.get_emi_status			= hpc_get_emi_status,
	.toggle_emi			= hpc_toggle_emi,
L
Linus Torvalds 已提交
983 984 985 986 987

	.get_max_bus_speed		= hpc_get_max_lnk_speed,
	.get_cur_bus_speed		= hpc_get_cur_lnk_speed,
	.get_max_lnk_width		= hpc_get_max_lnk_width,
	.get_cur_lnk_width		= hpc_get_cur_lnk_width,
988

L
Linus Torvalds 已提交
989 990 991 992
	.query_power_fault		= hpc_query_power_fault,
	.green_led_on			= hpc_set_green_led_on,
	.green_led_off			= hpc_set_green_led_off,
	.green_led_blink		= hpc_set_green_led_blink,
993

994
	.release_ctlr			= pcie_release_ctrl,
L
Linus Torvalds 已提交
995 996 997
	.check_lnk_status		= hpc_check_lnk_status,
};

998
int pcie_enable_notification(struct controller *ctrl)
M
Mark Lord 已提交
999
{
1000
	u16 cmd, mask;
L
Linus Torvalds 已提交
1001

1002
	cmd = PRSN_DETECT_ENABLE;
1003
	if (ATTN_BUTTN(ctrl))
1004
		cmd |= ATTN_BUTTN_ENABLE;
1005
	if (POWER_CTRL(ctrl))
1006
		cmd |= PWR_FAULT_DETECT_ENABLE;
1007
	if (MRL_SENS(ctrl))
1008 1009
		cmd |= MRL_DETECT_ENABLE;
	if (!pciehp_poll_mode)
1010
		cmd |= HP_INTR_ENABLE | CMD_CMPL_INTR_ENABLE;
1011

1012 1013
	mask = PRSN_DETECT_ENABLE | ATTN_BUTTN_ENABLE | MRL_DETECT_ENABLE |
	       PWR_FAULT_DETECT_ENABLE | HP_INTR_ENABLE | CMD_CMPL_INTR_ENABLE;
1014 1015

	if (pcie_write_cmd(ctrl, cmd, mask)) {
1016 1017
		ctrl_err(ctrl, "%s: Cannot enable software notification\n",
			 __func__);
1018
		return -1;
L
Linus Torvalds 已提交
1019
	}
1020 1021 1022 1023 1024 1025 1026 1027 1028
	return 0;
}

static void pcie_disable_notification(struct controller *ctrl)
{
	u16 mask;
	mask = PRSN_DETECT_ENABLE | ATTN_BUTTN_ENABLE | MRL_DETECT_ENABLE |
	       PWR_FAULT_DETECT_ENABLE | HP_INTR_ENABLE | CMD_CMPL_INTR_ENABLE;
	if (pcie_write_cmd(ctrl, 0, mask))
1029 1030
		ctrl_warn(ctrl, "%s: Cannot disable software notification\n",
			  __func__);
1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066
}

static int pcie_init_notification(struct controller *ctrl)
{
	if (pciehp_request_irq(ctrl))
		return -1;
	if (pcie_enable_notification(ctrl)) {
		pciehp_free_irq(ctrl);
		return -1;
	}
	return 0;
}

static void pcie_shutdown_notification(struct controller *ctrl)
{
	pcie_disable_notification(ctrl);
	pciehp_free_irq(ctrl);
}

static int pcie_init_slot(struct controller *ctrl)
{
	struct slot *slot;

	slot = kzalloc(sizeof(*slot), GFP_KERNEL);
	if (!slot)
		return -ENOMEM;

	slot->hp_slot = 0;
	slot->ctrl = ctrl;
	slot->bus = ctrl->pci_dev->subordinate->number;
	slot->device = ctrl->slot_device_offset + slot->hp_slot;
	slot->hpc_ops = ctrl->hpc_ops;
	slot->number = ctrl->first_slot;
	mutex_init(&slot->lock);
	INIT_DELAYED_WORK(&slot->work, pciehp_queue_pushbutton_work);
	list_add(&slot->slot_list, &ctrl->slot_list);
L
Linus Torvalds 已提交
1067 1068
	return 0;
}
1069

1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080
static void pcie_cleanup_slot(struct controller *ctrl)
{
	struct slot *slot;
	slot = list_first_entry(&ctrl->slot_list, struct slot, slot_list);
	list_del(&slot->slot_list);
	cancel_delayed_work(&slot->work);
	flush_scheduled_work();
	flush_workqueue(pciehp_wq);
	kfree(slot);
}

K
Kenji Kaneshige 已提交
1081
static inline void dbg_ctrl(struct controller *ctrl)
1082
{
K
Kenji Kaneshige 已提交
1083 1084 1085
	int i;
	u16 reg16;
	struct pci_dev *pdev = ctrl->pci_dev;
1086

K
Kenji Kaneshige 已提交
1087 1088
	if (!pciehp_debug)
		return;
1089

1090 1091 1092 1093 1094 1095 1096 1097 1098 1099
	ctrl_info(ctrl, "Hotplug Controller:\n");
	ctrl_info(ctrl, "  Seg/Bus/Dev/Func/IRQ : %s IRQ %d\n",
		  pci_name(pdev), pdev->irq);
	ctrl_info(ctrl, "  Vendor ID            : 0x%04x\n", pdev->vendor);
	ctrl_info(ctrl, "  Device ID            : 0x%04x\n", pdev->device);
	ctrl_info(ctrl, "  Subsystem ID         : 0x%04x\n",
		  pdev->subsystem_device);
	ctrl_info(ctrl, "  Subsystem Vendor ID  : 0x%04x\n",
		  pdev->subsystem_vendor);
	ctrl_info(ctrl, "  PCIe Cap offset      : 0x%02x\n", ctrl->cap_base);
K
Kenji Kaneshige 已提交
1100 1101 1102
	for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
		if (!pci_resource_len(pdev, i))
			continue;
1103 1104 1105
		ctrl_info(ctrl, "  PCI resource [%d]     : 0x%llx@0x%llx\n",
			  i, (unsigned long long)pci_resource_len(pdev, i),
			  (unsigned long long)pci_resource_start(pdev, i));
1106
	}
1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124
	ctrl_info(ctrl, "Slot Capabilities      : 0x%08x\n", ctrl->slot_cap);
	ctrl_info(ctrl, "  Physical Slot Number : %d\n", ctrl->first_slot);
	ctrl_info(ctrl, "  Attention Button     : %3s\n",
		  ATTN_BUTTN(ctrl) ? "yes" : "no");
	ctrl_info(ctrl, "  Power Controller     : %3s\n",
		  POWER_CTRL(ctrl) ? "yes" : "no");
	ctrl_info(ctrl, "  MRL Sensor           : %3s\n",
		  MRL_SENS(ctrl)   ? "yes" : "no");
	ctrl_info(ctrl, "  Attention Indicator  : %3s\n",
		  ATTN_LED(ctrl)   ? "yes" : "no");
	ctrl_info(ctrl, "  Power Indicator      : %3s\n",
		  PWR_LED(ctrl)    ? "yes" : "no");
	ctrl_info(ctrl, "  Hot-Plug Surprise    : %3s\n",
		  HP_SUPR_RM(ctrl) ? "yes" : "no");
	ctrl_info(ctrl, "  EMI Present          : %3s\n",
		  EMI(ctrl)        ? "yes" : "no");
	ctrl_info(ctrl, "  Command Completed    : %3s\n",
		  NO_CMD_CMPL(ctrl) ? "no" : "yes");
K
Kenji Kaneshige 已提交
1125
	pciehp_readw(ctrl, SLOTSTATUS, &reg16);
1126
	ctrl_info(ctrl, "Slot Status            : 0x%04x\n", reg16);
1127
	pciehp_readw(ctrl, SLOTCTRL, &reg16);
1128
	ctrl_info(ctrl, "Slot Control           : 0x%04x\n", reg16);
K
Kenji Kaneshige 已提交
1129
}
1130

1131
struct controller *pcie_init(struct pcie_device *dev)
K
Kenji Kaneshige 已提交
1132
{
1133
	struct controller *ctrl;
K
Kenji Kaneshige 已提交
1134 1135
	u32 slot_cap;
	struct pci_dev *pdev = dev->port;
1136

1137 1138
	ctrl = kzalloc(sizeof(*ctrl), GFP_KERNEL);
	if (!ctrl) {
1139
		dev_err(&dev->device, "%s : out of memory\n", __func__);
1140 1141 1142 1143
		goto abort;
	}
	INIT_LIST_HEAD(&ctrl->slot_list);

1144
	ctrl->pcie = dev;
K
Kenji Kaneshige 已提交
1145 1146 1147
	ctrl->pci_dev = pdev;
	ctrl->cap_base = pci_find_capability(pdev, PCI_CAP_ID_EXP);
	if (!ctrl->cap_base) {
1148 1149
		ctrl_err(ctrl, "%s: Cannot find PCI Express capability\n",
			 __func__);
1150 1151
		goto abort;
	}
K
Kenji Kaneshige 已提交
1152
	if (pciehp_readl(ctrl, SLOTCAP, &slot_cap)) {
1153
		ctrl_err(ctrl, "%s: Cannot read SLOTCAP register\n", __func__);
1154 1155 1156
		goto abort;
	}

K
Kenji Kaneshige 已提交
1157 1158 1159 1160 1161
	ctrl->slot_cap = slot_cap;
	ctrl->first_slot = slot_cap >> 19;
	ctrl->slot_device_offset = 0;
	ctrl->num_slots = 1;
	ctrl->hpc_ops = &pciehp_hpc_ops;
1162 1163 1164
	mutex_init(&ctrl->crit_sect);
	mutex_init(&ctrl->ctrl_lock);
	init_waitqueue_head(&ctrl->queue);
K
Kenji Kaneshige 已提交
1165
	dbg_ctrl(ctrl);
K
Kenji Kaneshige 已提交
1166 1167 1168 1169 1170 1171 1172 1173 1174
	/*
	 * Controller doesn't notify of command completion if the "No
	 * Command Completed Support" bit is set in Slot Capability
	 * register or the controller supports none of power
	 * controller, attention led, power led and EMI.
	 */
	if (NO_CMD_CMPL(ctrl) ||
	    !(POWER_CTRL(ctrl) | ATTN_LED(ctrl) | PWR_LED(ctrl) | EMI(ctrl)))
	    ctrl->no_cmd_complete = 1;
1175

1176 1177 1178
	/* Clear all remaining event bits in Slot Status register */
	if (pciehp_writew(ctrl, SLOTSTATUS, 0x1f))
		goto abort_ctrl;
1179

1180 1181
	/* Disable sotfware notification */
	pcie_disable_notification(ctrl);
M
Mark Lord 已提交
1182 1183 1184 1185 1186 1187 1188

	/*
	 * If this is the first controller to be initialized,
	 * initialize the pciehp work queue
	 */
	if (atomic_add_return(1, &pciehp_num_controllers) == 1) {
		pciehp_wq = create_singlethread_workqueue("pciehpd");
1189 1190
		if (!pciehp_wq)
			goto abort_ctrl;
M
Mark Lord 已提交
1191 1192
	}

1193 1194 1195
	ctrl_info(ctrl, "HPC vendor_id %x device_id %x ss_vid %x ss_did %x\n",
		  pdev->vendor, pdev->device, pdev->subsystem_vendor,
		  pdev->subsystem_device);
1196 1197 1198

	if (pcie_init_slot(ctrl))
		goto abort_ctrl;
K
Kenji Kaneshige 已提交
1199

1200 1201
	if (pcie_init_notification(ctrl))
		goto abort_slot;
K
Kenji Kaneshige 已提交
1202

1203 1204 1205 1206 1207 1208
	return ctrl;

abort_slot:
	pcie_cleanup_slot(ctrl);
abort_ctrl:
	kfree(ctrl);
1209
abort:
1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223
	return NULL;
}

void pcie_release_ctrl(struct controller *ctrl)
{
	pcie_shutdown_notification(ctrl);
	pcie_cleanup_slot(ctrl);
	/*
	 * If this is the last controller to be released, destroy the
	 * pciehp work queue
	 */
	if (atomic_dec_and_test(&pciehp_num_controllers))
		destroy_workqueue(pciehp_wq);
	kfree(ctrl);
1224
}